c# - 在 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>
在TextBlock
object 属性的情况下会正确显示,但是在 a 中使用它时DataGrid
,什么都不会显示。
这很奇怪,因为我在这两种情况下都以相同的方式调用它,并且我认为当没有指定数据上下文时,它会回退到父数据上下文。
我在声明中遗漏了什么吗?
笔记
我UserControl
在 MainWindow 中使用,并且将具有 NestedObject 属性的对象分配给它的数据上下文。此外,Name
正在实施INotifyPropertyChanged
.
解决方案
您通常将 a 中的列绑定到'sDataGrid
中项目的属性,即您当前的绑定仅在属性绑定或设置为 an并且类型具有属性时才有效。DataGrid
ItemsSource
ItemsSource
IEnumerable<T>
T
SomeObject
如果要绑定到另一个对象的属性,可以使用 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>
推荐阅读
- javascript - 了解“滚动时隐藏导航栏”代码 - Javascript
- javascript - 服务器未收到从客户端发送的 socket.io 消息
- tensorflow - 为什么“I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version”无法完成
- asp.net-core - 坚持 IEnumerable
在服务器端验证 ASP.Net Core MVC 之后 - python - 如何在解决方案生成期间更改 Cplex 模型?
- docker - 由于无效的 docker build 标签引用,GitLab 管道失败
- jmeter - JMeter:确定每秒的线程数
- php - 用 CSS 隐藏 PHP 变量
- typescript - 我可以对 Typescript 中的变量进行类型断言,该变量应该对整个块/函数有效吗?
- ios - 强制将不兼容的 Cordova 插件与电容器一起使用