【问题标题】:How to do a simple XAML (WPF) conditional binding on the Visibility property如何对 Visibility 属性进行简单的 XAML (WPF) 条件绑定
【发布时间】:2015-05-11 16:01:45
【问题描述】:

我有一个带有属性的视图模型:

public class MyModel
{
    public bool IsEnabled {get;set;}
}

我想使用这个属性来切换按钮状态。如果布尔值为真,我想隐藏按钮,否则显示它。

我尝试过这样的事情:

<Button Visibility= "{Binding IsEnabled ? Hidden : Visible  }">Enable</Button>

但这不合适。

我尝试了一些更复杂的解决方案,但我的猜测是,我遗漏了一些微不足道的东西。

有什么建议吗?

【问题讨论】:

  • 你需要添加一个布尔到可见性转换器

标签: c# wpf xaml


【解决方案1】:

由于您想在 HiddenVisible 之间切换并且 true 被隐藏,您可以编写自定义 IValueConverter 或使用简单的 Style.Trigger

<Button Content="Enable">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Visibility" Value="Visible"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEnabled}" Value="True">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>                    
        </Style>
    </Button.Style>
</Button>

这一切都假设 DataContext 已相应设置,MyModel.IsEnabled 每当更改时都会引发 INotifyPropertyChanged.PropertyChanged 事件

public class MyModel : INotifyPropertyChanged
{
    private bool _isEnabled;

    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            _isEnabled = value;
            OnPropertyChanged("IsEnabled");
        }
    }

    #region INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}

【讨论】:

  • 这太好了,我从你的回答中学到了很多。 &lt;DataTrigger 是用这种特定逻辑修改 xaml 元素属性的一般(最佳实践)方法吗?
  • 视情况而定。有时源和目标之间的关系更复杂,您需要编写 IValueConverterIMultiValueConverter 但如果您有一个值,则来自整个源属性值范围,什么时候应该发生 - 在您的情况下为 true 然后 Hidden - 使用更方便DataTrigger
【解决方案2】:

使用 BooleanToVisibilityConverter:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>

<Button Visibility= "{Binding IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" />

【讨论】:

  • 这不太一样,因为 BooleanToVisbilityConverter 返回 Collapsed(不是 Hidden)的 false 值。 OP 也切换了布尔值,所以 true 应该映射到 Hidden 而 false 应该映射到 Visible
  • 除了 true 意味着可见而不是隐藏/折叠
  • 并且操作也需要实现 INotifyPropertyChanged :)
【解决方案3】:

添加一个继承IValueConverter的类

public class BooleanToVisibilityConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool bValue = (bool)value;
        if (bValue)
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Visibility visibility = (Visibility)value;

        if (visibility == Visibility.Visible)
            return true;
        else
            return false;
    }
    #endregion
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2013-10-04
  • 2011-07-03
  • 2015-11-21
  • 2011-06-12
  • 2011-11-30
相关资源
最近更新 更多