【问题标题】:How to hide items of a combobox in WPF如何在 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”属性来隐藏/显示组合框中的项目。有人可以告诉我如何实现这一目标吗?

【问题讨论】:

    标签: wpf xaml combobox visibility


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-21
      • 2011-06-09
      • 1970-01-01
      • 2011-04-15
      • 2022-01-21
      • 2012-02-08
      • 1970-01-01
      • 2019-03-29
      相关资源
      最近更新 更多