XAML 在多个选项之间切换可见性

Posted

技术标签:

【中文标题】XAML 在多个选项之间切换可见性【英文标题】:XAML Toggle visibility among multiple options 【发布时间】:2011-07-10 01:30:43 【问题描述】:

在我的 WPF 应用程序的其中一个屏幕上,我列出了一个有用提示的枚举列表来向用户展示。这些提示消息中的每一个都包含复杂的标记,因此我想将消息定义保留在 XAML 中。我应该一次只显示其中一个提示。

如何根据我的枚举来切换这些消息的可见性?

我目前正在做的事情是这样的:

        <ContentControl Grid.Row="1">
            <ContentControl.Style>
                <Style TargetType="x:Type ContentControl">
                    <Setter Property="Visibility" Value="Collapsed"/>
                    <Style.Triggers>
                        <DataTrigger Binding="Binding Suggestion" Value="AddDescription">
                            <Setter Property="Visibility" Value="Visible"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>
            <Border Style="StaticResource SuggestBox">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Image Style="StaticResource SuggestImage"/>
                    <TextBlock Grid.Column="1" Style="StaticResource SuggestMessage">
                        You can add a description to this bookmark. Adding a description will make it easier to find.
                        <Hyperlink Command="Binding EditCommand">Add a description.</Hyperlink>
                    </TextBlock>
                </Grid>
            </Border>
        </ContentControl>

在上面的代码中,Suggestion 是一个枚举,其值对应于应该显示的提示。我只展示了一个提示的 XAML。每个附加提示都有自己的内容控件,其样式触发器绑定到 Suggestion 枚举的不同值。

这似乎有很多 XAML 支持简单的可见性切换操作。肯定有更简单或更好的方法吗?

(请注意,我不能将可见性触发器直接应用于 Border 元素的原因是 Border 元素已经设置了样式。显然,WPF 不允许您组合样式。)

更新:刚刚意识到这与WPF Visibility of a UI element based on combo selection 和How to hide/show items in a stack panel? 本质上是相同的问题,但在不同的上下文中。这些问题的答案似乎和我的 XAML 一样难看。

【问题讨论】:

【参考方案1】:

尝试使用转换器:http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convert.aspx

public class MyConverter : IValueConverter

    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
    
        Suggestion suggestion = (Suggestion)parameter;
        SomeParameter param = (SomeParameter )value;

        //Do your logical work here and return Visibility.Collapsed or Visibility.Visible.
    

这样称呼它:

<Setter Property="Visibility" Value="Binding Suggestion, Converter=StaticResource MyConverter, ConverterParameter=Binding SomeParameter"/>

或类似的东西,但这是一般的想法。

【讨论】:

我认为这可能有效。我需要将我正在寻找的枚举值作为 ConverterParameter 传递,并将其与 Suggestion 的当前值进行比较。

以上是关于XAML 在多个选项之间切换可见性的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 4:如何切换控件可见性

如何在列表视图索引中切换子元素的可见性?

无法将XAML按钮可见性与C#视图模型专用可见性变量绑定

将 XAML 中的可见性绑定到可见性属性

Javascript切换可见性多个div

根据多个复选框切换 div 可见性