набор инструментов wpf, сетка данных, столбец со списком

В datagrid у меня есть два DataGridComboBoxColumns. Элементы одного из этих столбцов должны зависеть от того, что выбрано в другом столбце. Базовая коллекция, используемая для моделирования этого, - dictionary<string,List<string>>. Как мне это реализовать? Кажется, я не могу подключиться к каким-либо релевантным событиям в столбцах, и я не могу найти никаких сценариев привязки данных, которые поддерживают это ..


person fsl    schedule 13.10.2009    source источник


Ответы (2)


Некоторое время назад у меня был такой же сценарий, и я исправил его следующим образом:

  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 изменяется, мне нужно было отображать новый список типов. Я использовал только статический список, в этом примере я использовал словарь.
С помощью этой настройки вы можете привязать свой combobox ItemsSource к 'DisplayableComboBoxItems', а ваше SelectedValue - к «TypeId». Вам понадобятся другие свойства для отображения правильного текста вместо TypeId.
Обратной стороной этого является то, что когда у вас более 1000 элементов, у вас будет один и тот же список для всех элементов. Однако со мной этого не произошло (DataGrid показывала не более 50 элементов).

Я надеюсь, что это достаточно ясно и поможет вам в правильном направлении!

ура!
Роэл

person RoelF    schedule 13.10.2009
comment
спасибо за ответ, Роэл, очень помог, но в итоге я выбрал другое решение. - person fsl; 14.10.2009

Вместо использования DataGridComboBoxColumn для второго столбца я выбрал DataGridTemplateColumn со встроенным Combobox. Для источника элементов я определил конвертер: 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>
person fsl    schedule 14.10.2009