在用户操作

时间:2015-12-18 11:45:22

标签: c# wpf listbox

我的WPF应用使用ListBox显示各组的跟踪消息。

<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>

以下是相关ObservableCollection中项目的定义。

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    {...}
    ...
}

现在我想让用户可以选择在运行时显示或隐藏的一个或多个组。 我不想只是从ObservableCollection中删除该组的项目,以便以后能够再显示它们。

这可以通过XAML以某种方式管理吗?

EDIT1: 基于 HiMa_D3ViL 的提示,我使用 Visibility 属性增强了“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>

部分有效。这意味着相关的条目将被隐藏,但它将在ListBox中留下一个空的空格。见这里:

enter image description here

2 个答案:

答案 0 :(得分:1)

根据集合的大小和访问次数,您可以将此逻辑保存在单独的属性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;
   }
}

答案 1 :(得分:0)

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

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

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