有没有更好的方法为ListView的ItemContainerStyle添加数字?

时间:2014-12-21 19:47:02

标签: c# xaml listview win-universal-app

我正在尝试扩展我的ListView的 ItemContainerStyle ,并添加一个带有绑定到属性的 TextBlock 。它应该显示 ListView.SelectedItems.Count

现在我有一个可行的解决方案,但我对它不满意(我怀疑有更简单的方法,可能更干净)。它是这样的:

  
<Style x:Key="MyItemStyle" TargetType="ListViewItem">
  <!--Some code-->     
  <Setter Property="Template">
    <Setter.Value>
       <ControlTemplate TargetType="ListViewItem">
         <!--Some code-->
         <TextBlock DataContext="{Binding ElementName=contentPresenter, Path=DataContext}" Text="{Binding Number}" Foreground="Red"/>

这个想法很简单 - 我将 DataContext 设置为与contentPresenter相同,这意味着如果我在 ItemClass 中属性数字我放在那里Item.Number = myList.SelectedItems.Count;一切正常。

但在这种风格中还有其他方法吗?我的 ItemClass 中没有其他属性?不知何故可能会扩展 ListView ListViewItem

1 个答案:

答案 0 :(得分:1)

最初我以为我可以使用ElementName绑定来检索ListView,然后将Text的{​​{1}}绑定到TextBlock'{ {1}}。类似于以下内容 -

ListView

但是,与SelectedItems.Count依赖项属性不同,这不起作用,因为<!-- this won't work --> <TextBlock Text="{Binding Path=SelectedItems, ElementName=myList, Converter="{StaticResource GetCountConverter}"}" /> 只是一个普通的只读属性。

一个常见的解决方法是创建一个带有几个附加属性的静态助手类。像这样的东西 -

SelectedItem

基本上我在这里创建了一个SelectedItems附加属性来利用数据绑定。每当public static class ListViewEx { public static int GetSelectedItemsCount(DependencyObject obj) { return (int)obj.GetValue(SelectedItemsCountProperty); } public static void SetSelectedItemsCount(DependencyObject obj, int value) { obj.SetValue(SelectedItemsCountProperty, value); } public static readonly DependencyProperty SelectedItemsCountProperty = DependencyProperty.RegisterAttached("SelectedItemsCount", typeof(int), typeof(ListViewEx), new PropertyMetadata(0)); public static bool GetAttachListView(DependencyObject obj) { return (bool)obj.GetValue(AttachListViewProperty); } public static void SetAttachListView(DependencyObject obj, bool value) { obj.SetValue(AttachListViewProperty, value); } public static readonly DependencyProperty AttachListViewProperty = DependencyProperty.RegisterAttached("AttachListView", typeof(bool), typeof(ListViewEx), new PropertyMetadata(false, Callback)); private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue) { var listView = d as ListView; if (listView == null) return; listView.SelectionChanged += (s, args) => { SetSelectedItemsCount(listView, listView.SelectedItems.Count); }; } } 被触发时,代码都会将附加属性更新为SelectedItemsCount的{​​{1}},以便它们始终保持同步。

然后在xaml中,您需要先将助手附加到SelectionChanged(以便检索Count实例并订阅其SelectedItems事件),

ListView

最后,更新ListView xaml。

中的绑定
SelectionChanged