在数据网格中,我有两个 DataGridComboBoxColumns。其中一列的项目应取决于在另一列中选择的内容。用于对此建模的基础集合是dictionary<string,List<string>>.
我应该如何实现这个?我似乎无法连接到列上的任何相关事件,也找不到任何支持这一点的数据绑定场景。
问问题
787 次
2 回答
0
前段时间我有同样的情况,并像这样修复它:
public class DataItem : INotifyPropertyChanged {
...
public List<SomeObject> DisplayableComboBoxItems {
get; set;
}
private static Dictionary<int, List<SomeObject>> myDict;
public Dictionary<int, List<SomeObject>> MyDict {
get {
if (myDict == null) {
myDict = GetYourDataFromSomewhere();
}
return myDict;
}
}
public int TypeId {
get { return typeId; }
set {
if (value == typeId) return;
typeId = value;
RaisePropertyChanged("TypeId");
}
}
public int TypeSetId {
get { return typeSetId; }
set {
if (typeSetId == value) return;
typeSetId = value;
RaisePropertyChanged("TypeSetId");
DisplayableComboBoxItems = MyDict[typeSetId];
RaisePropertyChanged("DisplayableComboBoxItems");
TypeId = 0;
}
}
...
}
DataItem 是绑定到 DataRow 的对象。这只是代码的一个小模型。基本上,每当 TypeSet 发生变化时,我都需要显示一个新的类型列表。我只使用了一个静态列表,在这个例子中我使用了一个字典。
通过此设置,您可以将组合框 ItemsSource 绑定到“DisplayableComboBoxItems”,并将 SelectedValue 绑定到“TypeId”。您将需要其他属性来显示正确的文本而不是 TypeId。
这样做的缺点是,当您拥有 1000 多个项目时,您将拥有所有项目的相同列表。然而,我的情况并非如此(DataGrid 最多显示 50 个项目)。
我希望这足够清楚,它可以帮助您朝着正确的方向前进!
干杯!
罗尔
于 2009-10-13T08:51:29.077 回答
0
我没有使用 DataGridComboBoxColumn 作为第二列,而是使用带有嵌入式 Combobox 的 DataGridTemplateColumn。对于 itemsource 我定义了一个转换器:string -> List<string>
. 转换器将另一个 DataGridComboBox(绑定到Navn
)的选定项的值转换为List<string>
,这只是一个字典查找。
像这样:
<my:DataGridTemplateColumn>
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Værdi}"
ItemsSource="{Binding Navn, Converter={StaticResource dimensionToValues}}"
>
</ComboBox>
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
于 2009-10-14T11:55:25.370 回答