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

时间:2013-08-22 16:14:39

标签: wpf data-binding ivalueconverter

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

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

我希望与此相反,如果Window处于活动状态,我希望将Visibility设置为false。这只是一个例子,但我遇到了其他情况,将'!'应用于由库转换器评估的布尔属性会很好,所以我不必编写自定义的。{/ p >

2 个答案:

答案 0 :(得分:4)

另一种方法是使用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>

答案 1 :(得分: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;
        }
    }