请你给我一个提示,让HasItems Property变得更好。 我有一个像这样的TreeView:
<TreeView ItemsSource="{Binding Customers}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="False">
<Setter Property="Foreground" Value="Blue" />
</DataTrigger>
</Style.Triggers>
<Setter Property="AutomationProperties.AutomationId" Value="{Binding AutomationId}" />
<Setter Property="IsExpanded" Value="True" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Customers}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding FamilyName}" Margin="5,0,0,0" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
代码背后:
public ObservableCollection<Customer> Customers { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
Customers = new ObservableCollection<Customer>();
var homer = new Customer("Homer", "Simpson");
homer.Customers.Add(new Customer("Bart", "Simpson"));
homer.Customers.Add(new Customer("Lisa", "Simpson"));
homer.Customers.Add(new Customer("Maggie", "Simpson"));
var chief = new Customer("Chief", "Wiggum");
chief.Customers.Add(new Customer("Ralf", "Wiggum"));
Customers.Add(homer);
Customers.Add(chief);
}
Class Customer实现了INotifyPropertyChanged,一切都很好。 正如你在这里看到的,我有一个DataTrigger来改变颜色,取决于&#34; HasItems&#34; TreeViewItem的属性。 问题是:HasItems为true,即使所有子项都被隐藏或折叠。
见这里:我做了'Wiggum&#34;的主席的可见性。崩溃了。并且&#34; Chief Wiggum&#34; -TreeViewItem仍然是红色。
答案 0 :(得分:2)
嗯,正如你可以想象的那样,项目被隐藏的事实并不意味着树视图没有项目。
一种可能的方法是以下列方式更改DataTrigger:
<DataTrigger Binding="{Binding Items, Converter={StaticResource HasVisibleItemsConverter}, RelativeSource={RelativeSource Self}}" Value="True">
创建一个实现IValueConverter
的 HasVisibleItemsConverter 转换器类,在那里你应该检查是否有任何可见的项目 - 我会留给你自己的练习。
然后在Resources区域(Window.Resources或UserControl.Resources)中创建 HasVisibleItemsConverter 的实例:
<Window.Resources>
<conv:HasVisibleItemsConverter x:Key="HasVisibleItemsConverter" />
</Window.Resources>
并且不要忘记在Window / UserControl的命名空间定义中添加conv="..."
,指向转换器所在的程序集和命名空间。