wpf - 如何在 WPF CellTemplate 中使用 DisplayMemberPath?
问题描述
在 DataGrid 中,其中一列是 Account。我想选择 AccountId,但 ComboBox 应该显示 AccountNames。所以我在下面创建了 xaml。它按要求工作,但有一个缺点。如果我更改帐户并转到同一行中的另一个单元格,则 AccountName 尚未更新。(如果我离开该行,则会根据新的 AccountId 计算和更新 AccountName。)
如果我只将 CellTemplate 与 ComboBox 一起使用,那么我就避开了这个问题,但我不喜欢这个解决方案,因为在不需要时显示 ComboBox 并不好。当我离开单元格时,我可以尝试更新 AccountName,但我的数据库视图会这样做,此时当前行中可能存在错误。因此,我想根据 AccountId 在 CellTemplate 中将选定的 AccountName 显示为 TextBlock。(我试图将 ComboBox 放入 TextBlock 中,但 TextBlock 不仅显示所选的 AccountName,还显示 ComboBox 本身。)
<DataGridTemplateColumn Header="{x:Static r:Resource.AccountName}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding AccountName, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource TextBlockError}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}, Path=DataContext.AccountObjects}"
SelectedValue="{Binding AccountId, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}"
SelectedValuePath="Id"
DisplayMemberPath="Name"
Style="{StaticResource ComboBoxError}" IsEditable="True"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
解决方案
您应该绑定到Account
数据对象的属性并实现INotifyPropertyChanged接口。您可能还想将该UpdateSourceTrigger
属性设置为PropertyChanged
:
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}, Path=DataContext.AccountObjects}"
SelectedItem="{Binding Account, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Name"
Style="{StaticResource ComboBoxError}" IsEditable="True"/>
推荐阅读
- python - 将时间戳对象转换为日期时间
- python - 在 Django virtualenv 中出现“无法识别 pip”错误时,如何解决该问题?
- html - img src 中的链接没有显示任何图片
- azure - Azure DevOps:创建不可变映像部署找不到脚本文件
- kubernetes - 调试缓慢的 Kubernetes 部署
- ruby-on-rails - 关闭 rails 终端中的缓存模型加载语句
- r - ComplexHeatmap:如何以不同的方式放置热图图例和注释图例?
- javascript - 使用 Javascript 禁用浏览器后退按钮
- r - 无法对 R 包 {xaringan} 中的中断有序列表使用 (@) 语法
- php - 按值排序PHP数组然后键