如何在WPF中绑定反布尔属性?

我拥有的是具有IsReadOnly属性的对象。 如果此属性为true,我想将按钮(例如)上的IsEnabled属性设置为false。

我想相信我可以像IsEnabled="{Binding Path=!IsReadOnly}"一样轻松完成,但不会与WPF一起飞。

我是否必须经历所有风格设置? 就像设置一个布尔到另一个布尔的反转一样简单,似乎太罗嗦了。

<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
                <Setter Property="IsEnabled" Value="False" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
                <Setter Property="IsEnabled" Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

您可以使用ValueConverter为您反转bool属性。

XAML:

IsEnabled="{Binding Path=IsReadOnly, Converter={StaticResource InverseBooleanConverter}}"

转换器:

[ValueConversion(typeof(bool), typeof(bool))]
    public class InverseBooleanConverter: IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            if (targetType != typeof(bool))
                throw new InvalidOperationException("The target must be a boolean");

            return !(bool)value;
        }

        public object ConvertBack(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }

        #endregion
    }

你有没有考虑过IsNotReadOnly属性? 如果绑定的对象是MVVM域中的ViewModel,那么附加属性就非常合理。 如果它是一个直接的实体模型,您可以考虑组合并向表单呈现实体的专门视图模型。


使用标准绑定,您需要使用看起来有点风的转换器。 所以,我建议你看看我的项目CalcBinding,它是专门为解决这个问题而开发的。 使用高级绑定,您可以直接在xaml中编写具有多个源属性的表达式。 说,你可以写一些类似的东西:

<Button IsEnabled="{c:Binding Path=!IsReadOnly}" />

要么

<Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/>

要么

<Label Content="{c:Binding A+B+C }" />

要么

<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" />

其中A,B,C,IsChecked - viewModel的属性,它会正常工作

祝你好运!

链接地址: http://www.djcxy.com/p/44649.html

上一篇: How to bind inverse boolean properties in WPF?

下一篇: Binding to ElementName in DataTemplate