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

时间:2010-04-05 19:06:03

标签: wpf data-binding

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

我只是想否定这个属性,所以Valueconverter可能是一个过度杀手!

注意:不使用ValueConverter

4 个答案:

答案 0 :(得分:41)

您可以使用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;
    }
}

然后你设置你的绑定:

<TextBlock Text="{Binding Path=IsAdmin, Converter={StaticResource boolConvert}}" />

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

<local:InvertBooleanConverter  x:Key="boolConvert"/>

编辑以回应评论:

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

public bool IsRegularUser
{
     get { return !this.IsAdmin; }
}

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

答案 1 :(得分:2)

如果您特别想在XAML结束时这样做(我不确定原因,除非您有100次类似的否定操作),只有两种方法1)使用IValueConverter 2)编写XAML标记扩展(为这项小任务付出太多工作:))

然后另一个显而易见的方法是在ViewModel中编写另一个属性,该属性可以返回IsAdmin属性的Negative。

答案 2 :(得分:0)

您可以编写一个值转换器,在返回之前自动否定输入。有关值转换器的简短读数,请查看BenCon's blog

答案 3 :(得分:0)

您无法绑定到!Property,但您可以使用适当的IValueConverter创建一个新的Binding,并在运行时更改整个Binding。关键是BindingOperations类,它允许您更改特定DependencyProperty上的绑定。

    public static void InvertBinding(DependencyObject target, DependencyProperty dp)
    {
        //We'll invert the existing binding, so need to find it
        var binding = BindingOperations.GetBinding(target, dp);
        if (binding != null)
        {
            if (binding.Converter != null)
                throw new InvalidOperationException("This binding already has a converter and cannot be inverted");
            binding.Converter = new InvertingValueConverter(); //This would be your custom converter

            //Not sure if you need this step, but it will cause the binding to refresh
            BindingOperations.SetBinding(target, dp, binding);
        }
    }

这应该给你一个大致的想法;我不会将它用于生产代码,因为您可能想要将其概括为切换转换器或在运行时更改所需的任何其他内容。您还可以通过创建绑定到的新属性来完全避免更改绑定,从而封装此“切换”逻辑。最后一个选项可能是最好的。