隐藏工具栏中的绑定错误

时间:2016-06-30 15:08:55

标签: c# wpf toolbar

我有下一个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;}
 }

当我不需要时,我会隐藏toolbartray。但即使SomeProperty设置为Visibility.Collapsed,当我使用ToolbarContextOne作为数据上下文时,我仍然会获得IsEnabled选项的绑定错误。 我怀疑它发生是因为它是解析器的工作原理。但是,如果没有我的数据上下文类改变,我可以采用一种方法来避免这个问题吗?

2 个答案:

答案 0 :(得分:3)

避免绑定错误的最简单方法是在绑定中使用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 :(得分:0)

除开发人员外,绑定错误是否非常重要?

绑定错误只能在调试输出窗口中显示,不是吗?

用户毕竟看不到工具包。

如果错误真的很烦人,您可以:

1为Datacontext提供ToolbarContextTwo。

2将IsEnbled属性添加到ToolbarContextOne

此致