Wpf 数据绑定正在工作,但输出窗口状态为数据绑定错误
我有一个Wpf 数据绑定正在工作,但输出窗口状态为数据绑定错误,wpf,Wpf,我有一个组合框,它绑定到我的viewmodel上的可观察集合。此集合中的对象类型为LanguageItem对象。我在组合框的ItemTemplate中有一个DataTemplate来定制UI 在这里,我有一个StackPanel,它有两个控件。这些控件绑定到LanguageItem对象中的某些属性。一切正常 这就是错误开始的地方。我有两种样式,一种在StackPanel上,另一种在TextBlock上。这些仅包含一些触发器,用于根据ComboBoxItem.IsHighlighted的值更改某些
组合框
,它绑定到我的viewmodel上的可观察集合
。此集合中的对象类型为LanguageItem
对象。我在组合框的ItemTemplate
中有一个DataTemplate
来定制UI
在这里,我有一个StackPanel
,它有两个控件。这些控件绑定到LanguageItem
对象中的某些属性。一切正常
这就是错误开始的地方。我有两种样式,一种在StackPanel
上,另一种在TextBlock
上。这些仅包含一些触发器,用于根据ComboBoxItem.IsHighlighted
的值更改某些颜色。两个DataTriggers
,一个为真,一个为假
现在,由于每个ComboBoxItem
的DataContext
将是我的LanguageItem
对象之一,为了访问IsHighlighted
属性,我使用RelativeSource
作为数据触发器中的绑定。下面是一个例子:
<DataTrigger Value="True"
Binding="{Binding Path=IsHighlighted,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ComboBoxItem}}}">
System.Windows.Data Error: 4 :
Cannot find source for binding with reference 'RelativeSource FindAncestor,
AncestorType='System.Windows.Controls.ComboBoxItem', AncestorLevel='1''.
BindingExpression:Path=IsHighlighted; DataItem=null;
target element is 'TextBlock' (Name='');
target property is 'NoTarget' (type 'Object')
我不明白如果绑定正常,为什么会记录此错误。起初,我怀疑这些错误消息是否指向这些绑定。我注释掉了这两种样式,错误消失了。但正如所料,鼠标上方的颜色变化也是如此
我是否对某些东西缺乏理解,或者这是VS中的一个bug?作为参考,这里有一个完整的样式。我的目标是.NET 3.0使用VS 2012和更新4
<DataTemplate DataType="{x:Type model:LanguageItem}">
...
<StackPanel.Style>
<Style TargetType="{x:Type StackPanel}">
<Style.Triggers>
<DataTrigger Value="True"
Binding="{Binding Path=IsHighlighted,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBoxItem}}}">
<Setter Property="Background" Value="{StaticResource TitleBrush}"/>
</DataTrigger>
<DataTrigger Value="False"
Binding="{Binding Path=IsHighlighted,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBoxItem}}}">
<Setter Property="Background" Value="{StaticResource BackgroundBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
...
</DataTemplate>
...
...
我猜DataContext
在某种程度上超出了范围。如果数据绑定工作正常,这应该不是问题。
但是,为了消除该错误,您可以在找不到时设置回退值:
<StackPanel.Style>
<Style TargetType="{x:Type StackPanel}">
<Setter Property="Background" Value="{StaticResource BackgroundBrush}"/>
<Style.Triggers>
<DataTrigger Value="True"
Binding="{Binding Path=IsHighlighted, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBoxItem}}, FallbackValue=False}">
<Setter Property="Background" Value="{StaticResource TitleBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
另外,我想指出的是,对于2状态DataTrigger,您不需要同时满足真/假条件。只有一个条件,而设置“默认”条件就足够了。可能的重复:检查它绑定发生的顺序实际上不在您的控制范围内。我发现多值转换器有这个问题。但是稍后将再次调用转换器,并使用所有绑定。谢谢您的帮助。设置FallBackValue将输出窗口中的红色错误替换为黄色警告,并显示完全相同的消息。我相当有信心它不会超出范围。此组合框始终显示在应用程序的工具栏上。但我要检查一下。我不知道这些触发器,并且已经更新了它们。