C# 在用户操作上显示/隐藏列表框项目

C# 在用户操作上显示/隐藏列表框项目,c#,wpf,listbox,C#,Wpf,Listbox,我的WPF应用程序使用列表框显示不同组的跟踪消息 <ListBox ItemsSource="{Binding ElementName=UI, Path=List}" x:Name="listBox"> <ListBox.ItemTemplate> <DataTemplate> <Grid Name="grid1" > <Grid.ColumnDefinition

我的WPF应用程序使用列表框显示不同组的跟踪消息

<ListBox ItemsSource="{Binding ElementName=UI, Path=List}" x:Name="listBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Name="grid1" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="70" />
                    <ColumnDefinition Width="140" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.Background>
                    <SolidColorBrush Color="{Binding Path=Color}"/>
                </Grid.Background>
                <TextBlock Grid.Column="0" Text="{Binding Path=ItemId}"/>
                <TextBlock Grid.Column="1" Text="{Binding Path=Timestamp}"/>
                <TextBlock Grid.Column="2" Text="{Binding Path=Message}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
现在,我想让用户可以选择一个或多个组在运行时显示或隐藏。 我不想只是从ObservaleCollection中删除组中的项,以便以后能够再次显示它们

这是否可以由XAML进行管理

Edit1: 根据HiMa_D3ViL的提示,我增强了“MyModel”的可见性属性,并将XAML修改为

<ListBox ItemsSource="{Binding ElementName=UI, Path=List}" x:Name="listBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Name="grid1" Visibility="{Binding Path=Visibility}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="70" />
                    <ColumnDefinition Width="140" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.Background>
                    <SolidColorBrush Color="{Binding Path=Color}"/>
                </Grid.Background>
                <TextBlock Grid.Column="0" Text="{Binding Path=ItemId}"/>
                <TextBlock Grid.Column="1" Text="{Binding Path=Timestamp}"/>
                <TextBlock Grid.Column="2" Text="{Binding Path=Message}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这在一定程度上起了作用。这意味着相关条目将被隐藏,但会在列表框中留下空白。请看这里:


根据集合的大小和访问次数,您可以将此逻辑保存在单独的属性getter中,该属性getter仅用作绑定源

public Interface IHidable
{
    bool hidden;
}

public class MyModel : IHidable , ...
{

}

private Collection<MyModel> realCoollection;  //use this for anything else
public Collection<IHidable > viewCollection  //Bind this in your WPF
{
  get {
     Collection<IHidable>  resCollection = new Collection<IHidable>();
     foreach (MyModel item in realCoollection)
     {            
        if (!item.hidden) res.Add((IHidable)item)
     }
     return resCollection;
   }
}
公共接口IHidable
{
布尔隐藏;
}
公共类MyModel:IHidable。。。
{
}
私人收藏再选择//还有什么用这个吗
public Collection viewCollection//将其绑定到WPF中
{
得到{
集合重新集合=新集合();
foreach(RealCoolSelection中的MyModel项)
{            
如果(!item.hidden)res.Add((IHidable)项)
}
返回重新收集;
}
}

在模型类中创建类型为Visibility的属性,并为ListBoxItem编写样式,例如:

<Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
        <Setter Property="Visibility" Value="{Binding Path=YourVisibilityProperty}"/>
 <Style/>


现在,基于用户操作,它允许您折叠和显示项,但它仍然保留在您的可观察集合中。

尝试使用CollectionViewSource,它提供了根据提供的条件筛选(通过谓词)绑定数据的功能。谢谢您的回答。集合可能会变得非常大,所以我认为这可能不是最好的解决方案(从性能和内存消耗的角度来看)。我已经使用这些类型的属性一段时间了,根据集合绑定到的控件,来保存许多不同的装饰。这个解决方案实际上比看起来要少很多内存和性能消耗,因为它只保存对对象的引用,而且创建这样一个列表与WPF在后台所做的工作相比是非常便宜的。另外,访问getter的次数通常也不是那么高。。。但我不知道你的收藏有多大。我的收藏可能包含数百万行。我完全不明白你想做什么。简单的过滤实际上非常简单。看这里:我读了教程,这听起来很有希望。起初我误解了这个特性,因为我认为CollectionViewSource只是复制了列表。教程中的内容很好用,当我在文本框中输入内容时,它会过滤内容,但对我来说不起作用。但是,将我的XAMl更改为
会导致列表框中出现空行。是的,如果您使用ListBoxItemStyle执行此操作,我明白您的意思。它不仅可以完美地按照您的要求工作,而且这对我来说非常适合,但您仍然存在问题,无法向我发送更多详细的代码。您的问题也可以通过触发器解决,例如:
public class MyModel : INotifyPropertyChanged
{
    private uint _itemId;
    private string _timestamp;
    private string _message;
    private string _color;
    private int _group;

    public uint     ItemId   {...}
    public string   Timestamp{...}
    public string   Message  {...}
    public string   Color    {...}
    public int      Group    {...}
    ...
}