我有下一个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选项的绑定错误。 我怀疑它发生是因为它是解析器的工作原理。但是,如果没有我的数据上下文类改变,我可以采用一种方法来避免这个问题吗?
答案 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
此致