我正在尝试扩展我的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 ?
答案 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