首页 > 解决方案 > 在 UserControl 中使用 Datagrid 时丢失 DataContext

问题描述

考虑这个 XAML:

<UserControl>
    <TextBlock Text="{Binding NestedObject.Name}" TextWrapping="Wrap"/>
    <DataGrid DataContext="{Binding}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding NestedObject.Name}" />
        </DataGrid.Columns>
    </DataGrid>
</UserControl>

TextBlockobject 属性的情况下会正确显示,但是在 a 中使用它时DataGrid,什么都不会显示。

这很奇怪,因为我在这两种情况下都以相同的方式调用它,并且我认为当没有指定数据上下文时,它会回退到父数据上下文。

我在声明中遗漏了什么吗?

笔记

UserControl在 MainWindow 中使用,并且将具有 NestedObject 属性的对象分配给它的数据上下文。此外,Name正在实施INotifyPropertyChanged.

标签: c#wpfdatagrid

解决方案


您通常将 a 中的列绑定到'sDataGrid中项目的属性,即您当前的绑定仅在属性绑定或设置为 an并且类型具有属性时才有效。DataGridItemsSourceItemsSourceIEnumerable<T>TSomeObject

如果要绑定到另一个对象的属性,可以使用 a{RelativeSource}显式指定绑定源:

<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Name">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding DataContext.SomeObject.Name, RelativeSource={RelativeSource AncestorType=UserControl}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding DataContext.SomeObject.Name, RelativeSource={RelativeSource AncestorType=UserControl}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Name" Binding="{Binding SomeObject.Name}" />
    </DataGrid.Columns>
</DataGrid>

推荐阅读