让我简要概述一下我的问题。
我有一个Window,它有一个ViewModel作为数据上下文。该窗口中还有2个用户控件。这些用户控件具有各种绑定到ViewModel中的属性的xaml对象,并且我对任何其他属性没有任何问题。
我遇到的问题是我创建的数据触发器不会触发。下面你可以看到我尝试过的数据触发器的xaml:
注意: IsBold是ViewModel中我用于Window的属性。我的印象是窗口中的用户控件将继承父级的数据上下文,所以我认为这不是我的问题。
<ScrollViewer >
<ListBox
ItemsSource="{Binding Path=Listings}"
SelectionMode="Single"
SelectedValue="{Binding Path=SelectedListingItemID}"
SelectedValuePath="ItemID"
Grid.IsSharedSizeScope="True">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="NotTriggered" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsBold}" Value="True">
<Setter Property="Text" Value="Triggered" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
当我运行它时,我将得到输出语句:
BindingExpression路径错误:'对象'''DataRowView'上找不到'DataContext'属性
这条消息让我相信我需要将数据触发器移动到xaml的另一部分,以便它意识到该属性来自ViewModel而不是ListBoxItem,但我在哪里移动它?或者这是正确的事情吗?
我希望我在所有必要的方面都很清楚,但如果不是,我当然可以在需要的地方详细说明。
感谢您的帮助!
答案 0 :(得分:0)
最简单的方法是使用relative source property,您可以使用FindAncestor模式和AncestorType of Window从窗口的dataContext中检查IsBold,如下所示:
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}, Path=IsBold}" Value="True">
<Setter Property="Text" Value="Triggered" />
</DataTrigger>