数据绑定和应用转换器时否定布尔属性

Posted

技术标签:

【中文标题】数据绑定和应用转换器时否定布尔属性【英文标题】:Negating a Boolean Property when data binding and applying converter 【发布时间】:2013-08-25 12:00:49 【问题描述】:

可以在 XAML 绑定标记中否定布尔属性。不确定这是否是正确的描述。例如,我正在使用内置转换器之一来根据窗口边框控件是否处于活动状态来设置它的可见性。

<Border BorderBrush="StaticResource BorderColorBrush" 
        BorderThickness="1" 
        Visibility="Binding IsActive, 
                     RelativeSource=RelativeSource FindAncestor, 
                                     AncestorType=x:Type Window, 
                     Converter=StaticResource bool2VisibilityConverter" />

我想要与此相反,如果窗口处于活动状态,我希望将 Visibility 设置为 false。这只是一个示例,但我遇到过其他情况,最好将“!”应用于由股票转换器评估的布尔属性,因此我不必编写自定义属性。

【问题讨论】:

这能回答你的问题吗? How to bind inverse boolean properties in WPF? 【参考方案1】:

另一种方法是使用 DataTrigger 而不是绑定转换器:

<Border BorderBrush="StaticResource BorderColorBrush" 
        BorderThickness="1">
    <Border.Style>
        <Style TargetType="Border">
            <Style.Triggers>
                <DataTrigger Binding="Binding IsActive,
                                       RelativeSource=RelativeSource FindAncestor,
                                                       AncestorType=Window"
                             Value="True">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

【讨论】:

这正是我想要的。我想我可以用一些这种标记来替换我的一些简单转换器。我不喜欢转换器,因为它们在那里有并且我会使用它们,但这将在许多领域派上用场。学习 WPF 就像剥洋葱一样。我喜欢它,并且每天都在学习新东西。【参考方案2】:

在 ViewModel 中创建一个否定属性:

public bool IsNotActive get  return !IsActive;  

并相应地通知更改,

-- 或者--

使用InverseBoolToVisibilityConverter

public class InverseBoolToVisibilityConverter: BaseConverterMarkupExtension<bool, Visibility>
    
        public override Visibility Convert(bool value, Type targetType, object parameter)
        
            return !value ? Visibility.Visible : parameter != null ? Visibility.Hidden : Visibility.Collapsed;
        

        public override bool ConvertBack(Visibility value, Type targetType, object parameter)
        
            return value != Visibility.Visible;
        
    

【讨论】:

或增强转换器以接受您可以通过 ConverterParameter 接收的参数 - 如果它是“不是”或类似的东西否定您返回的布尔值。不是很容易被发现或非常直观,但就像一个魅力。

以上是关于数据绑定和应用转换器时否定布尔属性的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms - 否定布尔绑定值

WPF Radiobutton(二)(绑定到布尔值)

WPF:多重绑定不使用 OnPropertyChanged 更新?

为啥这个 xamarin Binding Converter 会使应用程序崩溃?

Cocoa:如何将布尔属性绑定到 NSCellStateValue?

WPF - 是不是可以否定数据绑定表达式的结果?