如何在 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】:

非常简单:只需根据ComboBoxItemDataContextIsSelected 的值,为组合框项设置一个带有触发器的样式,该触发器设置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 反映更改。

【讨论】:

非常感谢!这太棒了:) 还要添加&lt;Setter Property="IsEnabled" Value="False" /&gt; 否则用户可以通过箭头键选择折叠项【参考方案2】:

如果您想显示特定属性并根据另一个属性值过滤掉项目,您应该同时使用ItemTemplateItemContainerStyle。 在此示例中,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 中隐藏组合框的项目的主要内容,如果未能解决你的问题,请参考以下文章

选择组合框时设置文本框的属性 WPF XAML

将组合框的值插入 WPF 中的数据库

WPF:在不知道项目的情况下更改组合框的字体大小

用于组合框模板的 WPF 高亮画笔

如何使用double数组的资源制作一个wpf组合框?

在使用ItemContainerGenerator进行自定义时,WPF ComboBox在第二次打开之前不会更新项目