如何在 WPF 中隐藏组合框的项目
Posted
技术标签:
【中文标题】如何在 WPF 中隐藏组合框的项目【英文标题】:How to hide items of a combobox in WPF 【发布时间】:2016-11-01 03:58:40 【问题描述】:有没有办法在 WPF 中隐藏组合框的项目? 在我的用户控件中,有一个带有复选框项的 ListBox 绑定到一个 ObservableCollection 和一个带有组合框的数据网格。
<ListBox x:Name="AvailableAttributes" Grid.Row="0" Grid.Column="2" SelectionMode="Single" >
<ListBox.ItemContainerStyle>
<Style TargetType="x:Type ListBoxItem">
<Setter Property="IsSelected" Value="Binding IsSelected, Mode=OneWay"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="Binding Name" IsChecked="Binding IsSelected"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
...
<DataGrid Name="datagrid" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Binding="Binding Name" />
<DataGridComboBoxColumn
SelectedValueBinding="Binding CBID"
DisplayMemberPath="Name"
SelectedValuePath="ID">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="x:Type ComboBox">
<Setter Property="ItemsSource"
Value="Binding Path=CBItems, RelativeSource=RelativeSource AncestorType=x:Type UserControl" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="x:Type ComboBox">
<Setter Property="ItemsSource"
Value="Binding Path=CBItems, RelativeSource=RelativeSource AncestorType=x:Type UserControl" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
我使用this solution 管理组合框项目并添加了属性“IsSelected”
public class GridItem
public string Name get; set;
public int CBID get; set;
public class CBItem
public int ID get; set;
public string Name get; set;
public bool IsSelected get; set;
现在我想使用“IsSelected”属性来隐藏/显示组合框中的项目。有人可以告诉我如何实现这一目标吗?
【问题讨论】:
【参考方案1】:非常简单:只需根据ComboBoxItem
的DataContext
上IsSelected
的值,为组合框项设置一个带有触发器的样式,该触发器设置ComboBoxItem.Visibility
:
<Style TargetType="x:Type ComboBox" BasedOn="StaticResource x:Type ComboBox">
<Setter Property="ItemsSource"
Value="Binding Path=CBItems, RelativeSource=RelativeSource AncestorType=x:Type UserControl" />
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ComboBoxItem" BasedOn="StaticResource x:Type ComboBoxItem">
<Style.Triggers>
<DataTrigger Binding="Binding IsSelected" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Setter.Value>
</Setter>
</Style>
如果在网格中加载 ComboBox 后,您可能会更新其中任何项目的 IsSelected
的值,则需要在 CBItem
上更新 implement INotifyPropertyChanged,以便 UI 反映更改。
【讨论】:
非常感谢!这太棒了:) 还要添加<Setter Property="IsEnabled" Value="False" />
否则用户可以通过箭头键选择折叠项【参考方案2】:
如果您想显示特定属性并根据另一个属性值过滤掉项目,您应该同时使用ItemTemplate
和ItemContainerStyle
。
在此示例中,ItemSource
已设置为 ObservableCollection
类型属性,该属性是另一个 Combobox ItemSource
的一部分
<ComboBox x:Name="combo2" ItemsSource="Binding SelectedItem.Devices,ElementName=combo1">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding Name"></TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Style.Triggers>
<DataTrigger Binding="Binding DeviceId" Value="125">
<Setter Property="Visibility" Value="Collapsed"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
【讨论】:
以上是关于如何在 WPF 中隐藏组合框的项目的主要内容,如果未能解决你的问题,请参考以下文章