首页 > 解决方案 > WPF 根据数据上下文值隐藏和显示按钮

问题描述

我有 2 个按钮,如下所示:

<Button x:Name="button1" Content="Button 1"/>
<Button x:Name="button2" Content="Button 2"/>

我在我的 DataContext 中有一个名为 IsButton1Visible 的 bool 变量,如果 IsButton1Visible == true,我希望 button1 可见,并且 button2 折叠,如果 IsButton1Visible == false,则 button1 折叠,并且 button2 可见。是否可以在不使用样式或代码隐藏的情况下完成此操作?XAML 答案主要是我正在寻找的。

标签: c#wpfxamlmvvm

解决方案


为什么不想使用样式?这是迄今为止最简单的方法。

一种没有样式的方法是通过布尔到可见性转换器,即这样的:

public class BooleanToVisibilityConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return false;
        var invert = (parameter == null) ? false : Boolean.Parse(parameter.ToString());
        if ((Boolean)value ^ invert)
            return Visibility.Visible;
        else
            return Visibility.Hidden;
    }

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

    #endregion
}

然后你会像这样使用它:

<Button x:Name="button1" Content="Button 1" Visibility="{Binding IsButton1Visible, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button x:Name="button2" Content="Button 2" Visibility="{Binding IsButton1Visible, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=true}" />

不过说真的,只需在样式中使用 DataTrigger 即可更改可见性,或者更好的是,模板化整个控件。当必须在视图和视图模型层之间转换数据时,您使用转换器,当它是单向时,您使用数据触发器。


推荐阅读