В datagrid у меня есть два DataGridComboBoxColumns. Элементы одного из этих столбцов должны зависеть от того, что выбрано в другом столбце. Базовая коллекция, используемая для моделирования этого, - dictionary<string,List<string>>.
Как мне это реализовать? Кажется, я не могу подключиться к каким-либо релевантным событиям в столбцах, и я не могу найти никаких сценариев привязки данных, которые поддерживают это ..
набор инструментов wpf, сетка данных, столбец со списком
Ответы (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 элементов).
Я надеюсь, что это достаточно ясно и поможет вам в правильном направлении!
ура!
Роэл
Вместо использования 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>