wpf工具包,datagrid,comboboxcolumn

时间:2009-10-13 08:17:40

标签: wpf datagrid wpftoolkit datagridcomboboxcolumn

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

2 个答案:

答案 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>