0

在数据网格中,我有两个 DataGridComboBoxColumns。其中一列的项目应取决于在另一列中选择的内容。用于对此建模的基础集合是dictionary<string,List<string>>.我应该如何实现这个?我似乎无法连接到列上的任何相关事件,也找不到任何支持这一点的数据绑定场景。

4

2 回答 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 回答