Как обновить элемент управления CellTemplate DataTemplate, когда элемент управления CellEditingTemplate DataTemplate изменяет свое связанное значение? - PullRequest
0 голосов
/ 30 ноября 2018

В моей 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 содержит как AssetDescriptionID, так и Item (описание).Для этого я присоединяю таблицу Assets к таблице AssetDescription, например, так:

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 голосов
/ 30 ноября 2018

Проблема в том, что вы привязываетесь только к AssetDescriptionID -Свойству вашего Asset.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}" />

Редактировать : Вы также можете использовать DataGridComboBoxColumn для варианта 2

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