首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在WPF中绑定逆布尔属性?

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

Stack Overflow用户
提问于 2009-06-25 00:59:54
回答 10查看 228.8K关注 0票数 414

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

我愿意相信我可以像IsEnabled="{Binding Path=!IsReadOnly}"一样简单地做这件事,但这与WPF不同。

我是否被降级为必须通过所有的样式设置?对于像将一个布尔值设置为另一个布尔值的倒数这样简单的事情来说,似乎太冗长了。

代码语言:javascript
复制
<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>
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-06-24 17:06:28

您可以使用为您反转布尔属性的ValueConverter。

XAML:

代码语言:javascript
复制
IsEnabled="{Binding Path=IsReadOnly, Converter={StaticResource InverseBooleanConverter}}"

转换器:

代码语言:javascript
复制
[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
    }
票数 536
EN

Stack Overflow用户

发布于 2009-06-24 17:07:43

您是否考虑过IsNotReadOnly属性?如果要绑定的对象是MVVM域中的ViewModel,那么额外的属性就很有意义。如果它是一个直接的实体模型,您可以考虑组合并将您的实体的专用ViewModel呈现给表单。

票数 105
EN

Stack Overflow用户

发布于 2014-12-06 05:14:34

对于标准绑定,您需要使用看起来有点多变的转换器。因此,我建议您查看我的项目CalcBinding,它是专门为解决这个问题和其他一些问题而开发的。使用高级绑定,您可以直接在xaml中编写具有许多源属性的表达式。比方说,你可以这样写:

代码语言:javascript
复制
<Button IsEnabled="{c:Binding Path=!IsReadOnly}" />

代码语言:javascript
复制
<Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/>

代码语言:javascript
复制
<Label Content="{c:Binding A+B+C }" />

代码语言:javascript
复制
<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" />

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

票数 80
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1039636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档