wpf toolkit, датагрид, comboboxcolumn - PullRequest
       20

wpf toolkit, датагрид, comboboxcolumn

0 голосов
/ 13 октября 2009

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

Ответы [ 2 ]

0 голосов
/ 14 октября 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>
0 голосов
/ 13 октября 2009

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

  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 элементов).

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

ура!
Рул

...