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のことがよくわかっていません。