WPF属性数据绑定以否定属性

aza*_*arp 27 data-binding wpf

有没有办法在WPF数据绑定中更改运行时的属性值.假设我的TextBox绑定到IsAdmin属性.无论如何我可以在XAML中更改该属性值!IsAdmin.

我只是想否定财产,所以Valueconverter可能是一个矫枉过正!

注意:不使用ValueConverter

Ree*_*sey 42

你可以使用IValueConverter.

[ValueConversion(typeof(bool), typeof(bool))]
public class InvertBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool original = (bool)value;
        return !original;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool original = (bool)value;
        return !original;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你设置你的绑定像:

<TextBlock Text="{Binding Path=IsAdmin, Converter={StaticResource boolConvert}}" />
Run Code Online (Sandbox Code Playgroud)

添加资源(通常在您的UserControl/Window中),如下所示:

<local:InvertBooleanConverter  x:Key="boolConvert"/>
Run Code Online (Sandbox Code Playgroud)

编辑以回应评论:

如果由于某种原因想要避免使用值转换器(虽然我觉得它是最合适的位置),您可以直接在ViewModel中进行转换.只需添加如下属性:

public bool IsRegularUser
{
     get { return !this.IsAdmin; }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果这样做,请确保您的IsAdmin属性设置器还PropertyChanged为"IsRegularUser"和"IsAdmin" 引发事件,因此UI会相应地更新.

  • @azamsharp:我编辑给你另一种选择 - 但不,我没有,主要是因为它是**可重用的**代码.制作转换器后,您可以在代码库中的任何位置使用它进行所有!bool转换. (10认同)
  • 难道你不认为这是一个简单的否定操作的工作! (7认同)
  • @azamsharp:如果它不是一个可重复使用的选项,那么是的,我同意你的意见...... (2认同)
  • 对于valueconverter,这是您需要使用的命名空间:`using System.Windows.Data; 使用System.Globalization;` (2认同)