当 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
包含 AssetDescriptionID
和 Item
(描述)。为此,我将资产 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
.
中选择了新值
我该如何完成?
问题是您只绑定到 Asset
的 AssetDescriptionID
-属性。
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>
我的 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
包含 AssetDescriptionID
和 Item
(描述)。为此,我将资产 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
.
我该如何完成?
问题是您只绑定到 Asset
的 AssetDescriptionID
-属性。
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>