Xceed DataGridControl ( Extended WPF Toolkit Community Editionの一部) をラップするコントロールがあります。コントロールは、ボタンのリスト (コンストラクターによってインスタンス化されたフィールド) を保持できる単純なプロパティ (バッキング依存関係プロパティなし) を提供します。
public List<Button> GroupButtons
{
get { return groupButtons; }
set { groupButtons = value; }
}
プロパティの項目は、コントロールを使用しているビューの XAML に追加されます。
<local:CustomControl ...>
<local:CustomControl.GroupButtons>
<Button>foo<Button>
</local:CustomControl.GroupButtons>
...
</local:CustomControl ...>
このリストのボタンを、Xceed Datagrid のいわゆる「GroupHeaderControl」内にレンダリングしたいと思います。これは、基本的に以下に示すようなグループ化行です。
これを実現するために、GroupHeaderControl の ControlTemplate を上書きしました。
<ResourceDictionary ...>
<Style TargetType="{x:Type controls:CustomControl}">
<Style.Resources>
<Style TargetType="{x:Type xcdg:GroupHeaderControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type xcdg:GroupHeaderControl}">
<Border ...>
<StackPanel Height="{TemplateBinding Height}" Orientation="Horizontal">
<ContentPresenter />
<ItemsControl ItemsSource="{Binding GroupButtons, RelativeSource={RelativeSource AncestorType={x:Type controls:CustomControl}}}" />
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Style.Resources>
</Style>
...
</ResourceDictionary>
ここで問題が発生します。GroupHeaderControl のインスタンスごとにボタンをレンダリングする代わりに、一度だけレンダリングします。説明のために、上の画像で 2 番目のグループ ヘッダー (「Lyon」) のボタンのみが表示され、もう 1 つ (「Reims」) は表示されないと想像してください。
この問題は、GroupButtons リストの項目が XAML 定義を介して追加されるという事実に明らかに関連しています。リストの項目をハードコーディングすると、魅力的に機能します。
public List<Button> ButtonList
{
get { return new List<Button>()
{
new Button() { Content = "foo" }
}
}
この振る舞いがどこから来ているのか、私にはよくわかりません。誰かがアイデアを持っていますか?