XAML Itemscontrol 绑定到 属性 控件外

XAML Itemscontrol binding to property outside of the control

我有一个要加载到 ItemsControl 中的事务列表,但我想在每个 row/transaction 中显示我的视图模型中的 UserId。 userId 不在事务列表中,它是我尝试访问的视图模型中的 属性,但似乎我尝试过的所有方法都不起作用,而且我不知道为什么。我得到的只是一个空白列值。 (是的,我确实确认 属性 不是空的。甚至硬编码了一个值但什么也没有得到)。

我的理解是我应该能够使用 AncestorType 为 Window 的 RelativeSource 来访问 属性。我错过了什么吗?

<ItemsControl ItemsSource="{Binding Path=MyReportResult.Transactions}" KeyboardNavigation.IsTabStop="False">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid Margin="20 2 0 2">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width=".15*"/>
                    <ColumnDefinition Width=".15*"/>
                </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" TextAlignment="Center" Margin="10 0 20 0" Text="{Binding Path=UserId, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"></TextBlock>
            <TextBlock Grid.Column="0" TextAlignment="Center" Margin="10 0 20 0" Text="{Binding Path=Amount}"></TextBlock>
            </Grid>
         </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

您的 RelativeSource 绑定试图在父 Window 中找到 属性,尽管它在 Window 的 DataContext 中。

如果 UserId 属性 与 MyReportResult 在同一视图模型 class 中,则以下内容应该有效:

<TextBlock Text="{Binding Path=DataContext.UserId,
                  RelativeSource={RelativeSource AncestorType=ItemsControl}}"/>

只有 WPF 支持 RelativeSource,因为这不是绝对必要的。像这样使用 ElementName 不那么脆弱:

首先,将 x:Name="something" 指定给您的顶级对象或其子对象(通常是网格)。

Text="{Binding Path=DataContext.UserId, Element=something}"