WPF DataGrid中能否将同一个UserControl同时绑定到column1和column2列
结论
完全可以,你当前的实现逻辑本身是合法可用的。
原理说明
WPF的DataTemplate在每次被渲染到不同单元格时,都会生成独立的UcFrameLessSheetInfoListviewItem实例,两个列的控件是完全独立的对象,不会互相冲突,不需要定义多个不同的UserControl。
常见优化&踩坑说明
如果你需要两个列的UserControl分别绑定不同的数据源(比如column1绑定行数据的image1字段、column2绑定image2字段),只需要在模板内给UserControl指定绑定即可,示例代码如下:
<DataGrid SelectionUnit="Cell" Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <DataGrid.Columns> <DataGridTextColumn Header="test1" Binding="{Binding Name}"/> <DataGridTextColumn Header="test2" Binding="{Binding image1}"/> <DataGridTextColumn Header="test3" Binding="{Binding image2}"/> <DataGridTemplateColumn Header="column1"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <!-- 绑定当前行的image1字段给UserControl --> <local:UcFrameLessSheetInfoListviewItem DataContext="{Binding image1}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="column2"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <!-- 绑定当前行的image2字段给UserControl --> <local:UcFrameLessSheetInfoListviewItem DataContext="{Binding image2}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
注意要避免一个常见错误:不要在UcFrameLessSheetInfoListviewItem的后台构造函数或者XAML里硬写DataContext = this,否则会打断父级DataContext的传递,导致两个列的UserControl都无法拿到行绑定的对应数据。
内容的提问来源于stack exchange,提问作者Rabit Bad
相关产品推荐
相关产品推荐

