在数据网格中,我有两个DataGridComboBoxColumns。其中一列的项目应取决于另一列中选择的内容。用于对此进行建模的基础集合是dictionary<string,List<string>>.
我应该如何实现这一点?我似乎无法连接到列上的任何相关事件,我找不到任何支持此事件的数据绑定方案..
答案 0 :(得分: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个项目)。
我希望这很清楚,它可以帮助你朝着正确的方向前进!
喝彩!
罗埃尔
答案 1 :(得分:0)
我没有使用DataGridComboBoxColumn作为第二列,而是使用带有嵌入式Combobox的DataGridTemplateColumn。对于itemsource,我定义了一个转换器:string -> List<string>
。转换器将另一个DataGridComboBox(绑定到Navn
)的selecteditem的值转换为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>