WPF:尝试根据组合框中的选择更改可见性

Posted

技术标签:

【中文标题】WPF:尝试根据组合框中的选择更改可见性【英文标题】:WPF: Trying to change visibility based on selection in combobox 【发布时间】:2020-04-07 23:07:26 【问题描述】:

我想根据组合框中的选择显示不同的堆栈面板。 想法是折叠任何不需要的堆栈面板。

组合框看起来像这样:

<StackPanel Grid.Row="0" Grid.Column="1">
    <TextBlock Text="New Question" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" Margin="10"/>
            <ComboBox x:Name="ComboBox" MaxWidth="200" IsTextSearchEnabled="True" SelectedValuePath="Choice">
                <ComboBox.Items>
                    <ComboBoxItem>Test</ComboBoxItem>
                    <ComboBoxItem>SliderQuestion</ComboBoxItem>
                    <ComboBoxItem>OpenQuestion</ComboBoxItem>
                </ComboBox.Items>
            </ComboBox>
</StackPanel>

所以如果选择了 Sliderquestion,我想显示包含 sliderquestion 设置元素的堆栈面板。

我现在有一个基本的堆栈面板设置,看起来像这样。

<StackPanel Grid.Column="1" Grid.Row="1">
      <StackPanel.Resources>
           <Style x:Key="ForSliderQuestion" TargetType="x:Type StackPanel">
                <Style.Triggers>
                    <DataTrigger Binding="Binding ElementName=ComboBox, Path=SelectedValue" Value="SliderQuestion">
                            <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                    <DataTrigger Binding="Binding ElementName=ComboBox, Path=SelectedValue" Value="OpenQuestion">
                         <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
               </Style.Triggers>
           </Style>
      </StackPanel.Resources>

       <StackPanel Style="DynamicResource ForSliderQuestion">
             <TextBlock Text="Test" FontSize="30"></TextBlock>
       </StackPanel>

</StackPanel>

老实说,我认为这不应该那么难,但我还是个新手,所以我知道什么。有人愿意帮忙吗? 谢谢!

编辑,解决方案:

好的,在 DrkDeveloper 的帮助下,我想通了。

我用了他的转换器。复制粘贴就好了。 问题是,他的绑定不​​断抛出“未在对象实例上设置对象引用”错误。我以前有这个。 滚动浏览 Visual Studio 给出的推荐选项后,我将其更改为这个并且它工作了!

<StackPanel>
     <TextBlock Text="New Question" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" Margin="10"></TextBlock>
            <ComboBox x:Name="_combo" MaxWidth="200" IsTextSearchEnabled="True">
                <ComboBoxItem Content="SliderQuestion"></ComboBoxItem>
                <ComboBoxItem Content="OpenQuestion"></ComboBoxItem>
            </ComboBox>
</StackPanel>
<StackPanel Visibility="Binding SelectionBoxItem, ElementName=_combo, 
      Converter=StaticResource ItemToVisibilityConverter, ConverterParameter=SliderQuestion">

      <TextBlock Text="TestTest"></TextBlock>
</StackPanel>

显然它需要明确知道它是什么类型的项目。 一个选择框项。

【问题讨论】:

在绑定中使用值转换器。 【参考方案1】:

这样的?

<Window.Resources>
        <loc:ItemToVisibilityConverter x:Key="itemToVisibilityConverter"></loc:ItemToVisibilityConverter>
    </Window.Resources>
    <Grid x:Name="_masterContainer">
        <ComboBox x:Name="_combo">
            Test
            Slider
            QuestionName
        </ComboBox>
        <StackPanel Visibility="Binding SelectedItem, Converter=StaticResource itemToVisibilityConverter, ConverterParameter=QuestionName, ElementName=_combo">
        </StackPanel>
        <StackPanel Visibility="Binding SelectedItem, Converter=StaticResource itemToVisibilityConverter, ConverterParameter=Slider, ElementName=_combo">
        </StackPanel>
        <StackPanel Visibility="Binding SelectedItem, Converter=StaticResource itemToVisibilityConverter, ConverterParameter=Test, ElementName=_combo">
        </StackPanel>
    </Grid>

根据您的目的选择 SelectedItem 或 SelectedValue...

有了这个:

public class ItemToVisibilityConverter : IValueConverter
    
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
         //Make the required checks here. if you content is comboboxitem or something you have to make the conversion here.
            if (value.ToString().Equals(parameter.ToString()))
                return Visibility.Visible;
            return Visibility.Collapsed;
        

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        
            throw new NotImplementedException();
        
    

编辑:添加样式方式:

<Window.Resources>
        <loc:ItemToVisibilityConverter x:Key="itemToVisibilityConverter"></loc:ItemToVisibilityConverter>
        <Style x:Key="sliderStyle" TargetType="StackPanel">
            <Setter Property="Visibility" Value="Collapsed"/> <!-- this is important-->
            <Style.Triggers>
                <DataTrigger Binding="Binding SelectedValue, ElementName=_combo, Converter=StaticResource itemToVisibilityConverter, ConverterParameter=Slider">
                    <DataTrigger.Setters>
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger.Setters>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid x:Name="_masterContainer">
        <ComboBox x:Name="_combo">
            Test
            Slider
            QuestionName
        </ComboBox>
        <StackPanel Visibility="Binding SelectedItem, Converter=StaticResource itemToVisibilityConverter, ConverterParameter=QuestionName, ElementName=_combo">
        </StackPanel>
        <StackPanel Style="StaticResource sliderStyle">
        </StackPanel>
    </Grid>

【讨论】:

以上是关于WPF:尝试根据组合框中的选择更改可见性的主要内容,如果未能解决你的问题,请参考以下文章

WPF 基于组合框选择使用 MVVM 改变窗口布局

使用PyQt中的QCheckBox或QComboBox更改小部件可见性

WPF 绑定不更新可见性

根据选择框更改 DIV 可见性

WPF 动画窗口可见性更改

在 WPF 中动态更改网格的可见性