DataGrid(WPFToolkit)のDataGridComboBoxColumsのバインディング不全
WPFToolkitのDataGridをいじっています。DataGridComboBoxColumsというのはその名の通り、コンボボックスのセルを作成するためのカラム定義です。
さて、DataGrid自体はViewModelにバインディングされており、他のカラム(DataGridTextColumsとか)はちゃんとバインドされて値が表示されています。その中にはUnitItemsというアクセサがあり、Unitクラスの配列を返します(単位マスタ)。単位(Unit)クラスにはNameプロパティがあります。ところが、このカラム定義で下記のようにItemsSourceとかSelectedItemBindingをちゃんとやってもうまくいきません。
<WPFToolkit:DataGridComboBoxColumn x:Uid="DataGridComboBoxColumnEx_1" MinWidth="20" Header="単位" ItemsSource="{Binding UnitItems}" SelectedItemBinding="{Binding Unit}" DisplayMemberPath="Name" />
コンボボックスに候補も出てこないし、表示もされません。ItemTemplateをつかって、DataGridComboBoxColumn内にあるComboBox自体に無理矢理SetterでItemSourceを設定すると候補は出てくるようになりましたが、表示はあいかわらずできません。これは次のような別のクラスを作ることで回避できました。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using Microsoft.Windows.Controls; namespace jp.or.jemai.LCA.LCAClient.Views { public class DataGridComboBoxColumnEx : DataGridComboBoxColumn { protected override System.Windows.FrameworkElement GenerateEditingElement(Microsoft.Windows.Controls.DataGridCell cell, object dataItem) { var element = base.GenerateEditingElement(cell, dataItem); CopyItemsSource(element); return element; } protected override System.Windows.FrameworkElement GenerateElement(Microsoft.Windows.Controls.DataGridCell cell, object dataItem) { var element = base.GenerateElement(cell, dataItem); CopyItemsSource(element); return element; } private void CopyItemsSource(FrameworkElement element) { BindingOperations.SetBinding(element, ComboBox.ItemsSourceProperty, BindingOperations.GetBinding(this, ComboBox.ItemsSourceProperty)); } } }
これで
<ex:DataGridComboBoxColumnEx x:Uid="DataGridComboBoxColumnEx_1" MinWidth="20" Header="単位" ItemsSource="{Binding UnitItems}" SelectedItemBinding="{Binding Unit}" DisplayMemberPath="Name" />
うまくいきます。
なんだろ、内包するComboBoxとの間でうまくソースがやりとりできてないのかな。まだWPFのことがよくわかっていません。