我有一个将DataTemplate分配给'ItemTemplate的列表框,如下所示:
<ListBox Name="DayOverview">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Width="125" Background="Transparent" Orientation="Horizontal" MouseLeftButtonDown="DayOverview_MouseLeftButtonDown">
<Label Content="{Binding Owner}"/>
<Label Content="{Binding Subject}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我想设置一些'Items Visiblity在代码隐藏中崩溃,如下所示:
(DayOverview.Items[i] as ListBoxItem).Visibility = Visibility.Collapsed;
但我无法将其'Item转换为ListBoxItem或任何其他控件,Items是类的类型。是否可以使用C#中的datatemplate隐藏ListBox的项目?
答案 0 :(得分:4)
DayOverview.Items
集合将包含您绑定ItemsSource
属性的项目。它不是Visual容器的数据。 ListBox
将使用ListBoxItem
为您的每个商品生成ItemContainerGenerator
容器。
您可以使用ItemContainerGenerator
的ContainerFromIndex方法从数据项中获取可视化容器。
试试这个:
DayOverview.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem).Visibility = Visibility.Collapsed;
答案 1 :(得分:0)
这看起来像是CollectionViewSource
的工作。
var cvs = CollectionViewSource.GetDefaultView(listbox.Items);
cvs.Filter = item => ((ItemType) item).Name == "Bob"; // assign a Filtermethode like this
cvs.Filter = FilterMethod; // or like this
private bool FilterMethod(object obj)
{
var item = (ItemType) obj;
return item.Name == "Bob";
}
CollectionViewSource使用Predicate
确定是否应显示某个项目。