首页 > 解决方案 > 如何在 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>

标签: wpfxamldatagrid

解决方案


您应该绑定到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"/>

推荐阅读