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

时间:2011-03-07 02:09:17

标签: wpf xaml visibility

在我的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 selectionHow to hide/show items in a stack panel?基本相同,但在不同的背景下。这些问题的答案看起来和我的XAML一样难看。

1 个答案:

答案 0 :(得分:3)

尝试使用转换器: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}}"/>

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