我的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表连接到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
。
我该怎么做?
答案 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