首页 > 解决方案 > 当 CellEditingTemplate DataTemplate 控件更改其绑定值时,如何更新 CellTemplate DataTemplate 控件?

问题描述

我的 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 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(描述)。为此,我将 Assets 表连接到 AssetDescriptions 表,如下所示:

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);

这一切都完美无缺,除了在.TextBlockCellTemplate DataTemplateComboBox

我该如何做到这一点?

标签: c#wpfwpfdatagriddatatemplatedatagridtemplatecolumn

解决方案


问题是你只绑定到你的AssetDescriptionID-Property AssetItem永远不会被触及(你的CellTemplate绑定)。

选项 1:
尝试使用 aDataGridComboBoxColumn而不是DataGridTemplateColumn
Item(on Asset) 然后不再需要

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

选项 2:如果您真的需要Item/descriptionAsset
最简单的解决方案是绑定整个对象(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}" />

编辑:您也可以使用 a DataGridComboBoxColumnfor Option 2

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

推荐阅读