【发布时间】:2022-01-05 19:08:03
【问题描述】:
在问我的问题之前,我将描述当前的架构。 我有以下类和控件(我只会放问题的相关代码):
public class FieldType
{
Type Type {get;set;}
string DisplayName {get;set;}
}
public class FieldDefinition<T>
{
string Name {get;set;}
string Description {get;set;}
strign Type Type => typeof(T);
}
public class MyDefinition
{
string Prop1 {get;set;}
string Prop2 {get;set;}
IEnumerable<FieldDefinition> FieldsDefinitions{get;set;}
}
我有一个 CreatorUserControl 来创建一个新的 MyDefinition 对象。
CreatorUserControl 有一些 TextBox 来设置字符串属性(Prop1 和 Prop2)和 ItemsControl 来添加/更新/删除 FieldsDefinitons。 ItemsControl 的数据上下文设置为FieldDefinition,因为这个控件只处理这个属性。
我有两个 TextBox 来更新 Name 和 Description 以及 ComboBox 来更新 Type。 当我只显示 DisplayName 时,Combobox ItemsSource 是一个 FieldTypes 列表(我不想保存每个实例支持的类型列表)。
当我更改 ComboBox 中的项目时,我使用 SelectionChangedEvent 到 SelectionChangedCommand 之间的边界来接收更新。我已将 MyDefinition 实例发送到命令,然后使用新类型名称创建了一个新的 FieldDefinition(我使用反射将 ComboBox 项上的字符串名称转换为 T 通用项。在获得FieldDefinition 的新实例之后我将之前FieldDefinition 中的所有相关属性复制到新属性中,从MyDefinition 的列表中删除了之前的FieldDefinition(已发送到命令)并添加新属性。
问题是,目前当我更改 ComboBox 中的项目时,所有 ComboBoxes 都会同时更改(因为 SelectedItem 属性绑定到视图模型并且所有行都相同)。我需要每行处理这个。我正在考虑删除 ComboBox 中的 SelectedItem 绑定,这样我就可以为每个 Combobox 发送 MyDefinition 对象和 SelectedItemText。我在问这是否是最简单和正确的方法。如果答案是肯定的,我如何在不使用 MultiBinding 和实现转换器的情况下发送这两个参数。我想保持简单并避免额外的代码。
注意:如果需要,我还想中止 SelectionChanged 事件。
例如:如果 ComboBox 项中的新类型不受 FieldDefinition 支持(反射失败)或类型不存在于支持的类型列表中。
【问题讨论】:
-
您应该有一个源属性来跟踪每行选定的项目,并且您不能从单个目标属性绑定到多个源属性。
-
@mm8 成功了。把它作为答案