DataTrigger无法在ListBox.ItemTemplate中工作

时间:2012-08-16 16:14:28

标签: c# wpf xaml datatrigger

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

我有一个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,但我在哪里移动它?或者这是正确的事情吗?

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

感谢您的帮助!

1 个答案:

答案 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>