【问题标题】:Hiding Items of a ListBox which has Datatemplate in Codebehind WPF在代码隐藏 WPF 中隐藏具有数据模板的列表框的项目
【发布时间】:2014-08-06 09:41:06
【问题描述】:

我有一个将 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>

我想将它的一些“项目可见性”设置为在代码隐藏中折叠,如下所示:

(DayOverview.Items[i] as ListBoxItem).Visibility = Visibility.Collapsed;

但我无法将其项目转换为 ListBoxItem 或任何其他控件,项目是类的类型。是否可以在 C# 中使用 datatemplate 隐藏 ListBox 的项目?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    DayOverview.Items 集合将包含您将ItemsSource 属性绑定到的项目。它是数据而不是 Visual 容器。 ListBox 将使用 ItemContainerGenerator 为您的每个项目生成一个 ListBoxItem 容器。

    您可以使用ItemContainerGenerator 的ContainerFromIndex 方法从数据项中获取可视化容器。

    试试这个:

    DayOverview.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem).Visibility = Visibility.Collapsed;
    

    【讨论】:

      【解决方案2】:

      这看起来像是 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 来确定是否应显示项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-09
        • 2019-12-10
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        相关资源
        最近更新 更多