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

时间:2018-11-30 19:24:27

标签: c# wpf wpfdatagrid datatemplate datagridtemplatecolumn

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

这一切都很好,除了 ,当在TextBlock CellTemplate中选择新值时,DataTemplate不会更新为新描述。 ComboBox

我该怎么做?

1 个答案:

答案 0 :(得分:1)

问题在于您仅绑定到AssetDescriptionID的{​​{1}}属性。 Asset将永远不会被触摸(您的Item绑定到的对象)。

选项1:
尝试使用CellTemplate代替DataGridComboBoxColumn
这样就不再需要DataGridTemplateColumn(位于Item上)

Asset

选项2:如果您确实需要<DataGridComboBoxColumn DisplayMemberPath="Item" Header="Item" ItemsSource="{Binding Data.AssetDescriptions, Source={StaticResource proxy}}" SelectedValueBinding="{Binding AssetDescriptionID}" SelectedValuePath="AssetDescriptionID"> </DataGridComboBoxColumn> 上的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

修改: 您还可以为选项2使用<TextBlock Text="{Binding AssetDescription.Item}" />

DataGridComboBoxColumn