隐藏在WPF后面的代码中具有Datatemplate的ListBox的项目

时间:2014-08-06 09:41:07

标签: wpf

我有一个将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的项目?

2 个答案:

答案 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确定是否应显示某个项目。