c# - 当 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
包含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
我该如何做到这一点?
解决方案
问题是你只绑定到你的AssetDescriptionID
-Property Asset
。
Item
永远不会被触及(你的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 DataGridComboBoxColumn
for Option 2
<DataGridComboBoxColumn
DisplayMemberPath="Item"
Header="Item"
ItemsSource="{Binding Data.AssetDescriptions, Source={StaticResource proxy}}"
SelectedItemBinding="{Binding AssetDescription}">
</DataGridComboBoxColumn>
推荐阅读
- jquery - 全局变量、延迟和 this
- macos - NSColor systemColor 在暗/亮模式切换时不会改变
- javascript - React navigation in react-native v0.60 is broken
- iis - 网页在 VS 2012 中工作,但在 IIS 中无法正常工作
- hyperledger-fabric - 在 Hyperledger Fabric 中以高速率发送交易时,Orderer 未发现错误
- android - 如何从覆盖活动的片段中膨胀菜单
- performance - MarkLogic - 错误日志文件中的慢速 Fsync 通知/警告不断
- azure - 从哪里读取 APPINSIGHTS_INSTRUMENTATIONKEY?
- flutter - bool.fromEnvironment 总是返回 false
- django - 使用 python 将 csv 文件写入 SQL 表