WPF MVVM模式下为DataGrid自动生成的DataGridTextColumn绑定ToolTip问询
实现方案
第一步:调整DataTable填充逻辑
将First列的存储类型从字符串改为ObservableCollection<SubModel>,保留后续绑定所需的完整集合数据,后续通过绑定规则控制显示内容即可:
// 修改列类型为集合类型 dataTable.Columns.Add("First", typeof(ObservableCollection<SubModel>)); foreach (Model item in modelItems) { DataRow dataRow = dataTable.NewRow(); // 直接存储完整集合,而非仅第一个元素的名称 dataRow[0] = item.SomeValues; dataTable.Rows.Add(dataRow); }
第二步:修改自动生成列的绑定规则
调整AutoGeneratingColumn事件中的列绑定路径,直接从集合中取第一个元素的Name属性用于表格常规展示:
var textColumn = new DataGridTextColumn { // 绑定集合第一个元素的Name属性用于显示 Binding = new Binding($"{e.PropertyName}[0].Name"), Header = e.PropertyName, CellStyle = (sender as FrameworkElement).FindResource("FirstColumnStyle") as Style }; e.Column = textColumn;
第三步:修改Style中ToolTip的定义
将ToolTip设置为列表容器,绑定完整集合展示所有Name值:
<Style x:Key="FirstColumnStyle" TargetType="DataGridCell"> <!-- 其他Setter省略 --> <Setter Property="ToolTip"> <Setter.Value> <ItemsControl ItemsSource="{Binding First}"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" Margin="2,0"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Setter.Value> </Setter> </Style>
补充说明
你之前对ComboBox绑定的认知存在偏差:ComboBox的ItemsSource可以绑定当前行数据上下文中的任意集合属性,并非只能绑定静态资源或全局ViewModel属性。如果后续需要用下拉列表实现同类需求,只需把DataGridTemplateColumn里的ComboBox的ItemsSource绑定到行数据上下文的First集合即可。
内容的提问来源于stack exchange,提问作者Melissa
相关产品推荐
相关产品推荐

