0

让我简要概述一下我的问题。

我有一个以 ViewModel 作为数据上下文的窗口。此窗口中还有 2 个用户控件。这些用户控件具有绑定到 ViewModel 中的属性的各种 xaml 对象,并且我对任何其他属性都没有问题。

我遇到的问题是我创建的数据触发器不会触发。您可以在下面看到我尝试过的数据触发器的 xaml:

注意: IsBold 是我用于 Window 的 ViewModel 中的一个属性。我的印象是窗口中的用户控件将从父级继承数据上下文,所以我不认为这是我的问题。

<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,但我应该将它移动到哪里?或者这甚至是正确的做法?

我希望我在所有必要的领域都足够清楚,但如果我不是,我当然可以在需要的地方详细说明。

谢谢你的帮助!

4

1 回答 1

0

最简单的方法是使用相对源属性,您可以使用 FindAncestor 模式和窗口的 AncestorType 从窗口的 dataContext 中检查 IsBold,如下所示:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}, Path=IsBold}" Value="True">
    <Setter Property="Text" Value="Triggered" />
</DataTrigger>
于 2012-08-16T16:27:06.227 回答