隐藏工具栏绑定错误

本文关键字:错误 绑定 工具栏 隐藏 | 更新日期: 2023-09-27 17:53:22

我有下一个xaml:

<ToolbarTray Visibility="{Binding SomeProperty}">
    <Toolbar>
       <Checkbox IsEnabled="{Binding IsEnabled}/"
        <... other items />
    </Toolbar>
</Toolbar>

和两个类作为可能的数据上下文-用于两个不同的窗口。

 class ToolbarContextOne
 {
     public Visibility SomeProperty {get;set;}
 }
 class ToolbarContextTwo:ToolbarContextOne
 {
     public bool IsEnabled {get;set;}
 }
当我不需要工具栏时,我会隐藏它。但即使SomeProperty设置为Visibility。崩溃了,当我使用ToolbarContextOne作为数据上下文时,我仍然得到IsEnabled选项的绑定错误。我怀疑发生这种情况是因为解析器就是这样工作的。但也许有一种方法可以避免这个问题,而不改变我的数据上下文类?

隐藏工具栏绑定错误

避免绑定错误的最简单方法是在绑定中使用FallbackValue:

<ToolbarTray Visibility="{Binding SomeProperty}">
    <Toolbar>
       <Checkbox IsEnabled="{Binding IsEnabled, FallbackValue=False}/"
        <... other items />
    </Toolbar>
</Toolbar>


另一种方法是仅在DataContext具有特定属性时启用绑定:

<CheckBox>
    <CheckBox.Resources>
        <local:HasPropertyConverter x:Key="HasPropertyConverter"/>
    </CheckBox.Resources>
    <CheckBox.Style>
        <Style TargetType="CheckBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=.,Converter={StaticResource HasPropertyConverter},
                                                      ConverterParameter=IsEnabled}"
                             Value="True">
                    <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>
</CheckBox>

和转换器:

public class HasPropertyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return false;
        }
        if (parameter == null)
        {
            return false;
        }
        PropertyInfo property = value.GetType().GetProperty(parameter.ToString());
        return property != null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

除了开发人员之外,绑定错误还那么重要吗?

绑定错误只在调试输出窗口中可见,不是吗?

用户最终看不到工具栏。

如果这个错误真的很烦人,你可以:

1为数据上下文提供一个ToolbarContextTwo。

2将isenabled属性添加到ToolbarContextOne