データグリッドには、2 つの DataGridComboBoxColumns があります。これらの列のいずれかの項目は、他の列で選択されている内容に依存する必要があります。これをモデル化するために使用される基になるコレクションは、これをdictionary<string,List<string>>.
実装するにはどうすればよいですか? 列の関連するイベントに接続できないようで、これをサポートするデータバインディングのシナリオが見つかりません..
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 が変更されるたびに、Type の新しいリストを表示する必要がありました。静的リストのみを使用しました。この例では、辞書を使用しました。
このセットアップでは、コンボボックスの ItemsSource を「DisplayableComboBoxItems」にバインドし、SelectedValue を「TypeId」にバインドできます。TypeId の代わりに正しいテキストを表示するには、他のプロパティが必要になります。
これの欠点は、1000 個以上のアイテムがある場合、すべてのアイテムに対して同じリストが作成されることです。ただし、これは私には当てはまりませんでした (DataGrid は最大 50 項目を示しました)。
これが十分に明確であり、正しい方向に役立つことを願っています!
乾杯!
ロエル
2 番目の列に 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>