我的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中留下一个空的空格。见这里:
答案 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/>
现在,根据用户操作,它允许您折叠和显示项目,但它仍然保留在您的可观察集合中。