当 CellEditingTemplate DataTemplate 控件更改其绑定值时,如何更新 CellTemplate DataTemplate 控件?

How do I update the CellTemplate DataTemplate control when the CellEditingTemplate DataTemplate control changes its bound value?

我的 DataGrid 中有一个模板列,如下所示:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Item}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox
                DisplayMemberPath="Item"
                Header="Item"
                ItemsSource="{Binding Data.AssetDescriptions, Source={StaticResource proxy}}"
                SelectedValueBinding="{Binding AssetDescriptionID}"
                SelectedValuePath="AssetDescriptionID" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

ViewModel 有一个 public 属性 包含资产描述:

public IEnumerable<AssetDescription> AssetDescriptions { get; set; }

其中 AssetDescription 本质上是:

public class AssetDescription
{
    public int AssetDescriptionID { get; set; }
    public string Item { get; set; } // Description
}

DataGrid 本身绑定到 ObservableCollection<Asset> Assets 属性,其中 Asset 包含 AssetDescriptionIDItem(描述)。为此,我将资产 table 加入到资产描述 table,如下所示:

var assets = _conn.Query<Asset>(
                @"SELECT A.AssetDescriptionID, D.Item 
                    FROM Assets A
                    JOIN AssetDescriptions D
                      ON D.AssetDescriptionID = A.AssetDescriptionID");

Assets = new ObservableCollection<Asset>(assets);

一切正常,除了 CellTemplate DataTemplate 中的 TextBlock 在在 ComboBox.

中选择了新值

我该如何完成?

问题是您只绑定到 AssetAssetDescriptionID-属性。 Item 永远不会被触及(你的 CellTemplate 绑定到)。

选项 1:
尝试使用 DataGridComboBoxColumn 而不是 DataGridTemplateColumn
Item(在 Asset 上)就不再需要了

<DataGridComboBoxColumn 
    DisplayMemberPath="Item"
    Header="Item"
    ItemsSource="{Binding Data.AssetDescriptions, Source={StaticResource proxy}}"
    SelectedValueBinding="{Binding AssetDescriptionID}"
    SelectedValuePath="AssetDescriptionID">
</DataGridComboBoxColumn>

选项 2: 如果您确实需要 Item/描述 Asset
最简单的解决方案是绑定整个对象(AssetDescription).

把你的Asset改成这个

class Asset
{
    ...
    public AssetDescription AssetDescription {get;set;}
    ...
}

还有你的CellEditingTemplate到这个

<DataTemplate>
    <ComboBox
        DisplayMemberPath="Item"
        ItemsSource="{Binding Data.AssetDescriptions, Source={StaticResource proxy}}"
        SelectedItem="{Binding AssetDescription }" />
</DataTemplate>

CellTemplate到这个

<TextBlock Text="{Binding AssetDescription.Item}" />

编辑: 您还可以对选项 2

使用 DataGridComboBoxColumn
<DataGridComboBoxColumn 
    DisplayMemberPath="Item"
    Header="Item"
    ItemsSource="{Binding Data.AssetDescriptions, Source={StaticResource proxy}}"
    SelectedItemBinding="{Binding AssetDescription}">
</DataGridComboBoxColumn>