我有一个包装Xceed DataGridControl的控件(扩展 WPF 工具包社区版的一部分)。该控件提供了一个简单的属性(没有支持依赖属性),它可以保存按钮列表(由构造函数实例化的字段):
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 的每个实例呈现按钮,而是只呈现一次。为了说明,假设在上图中,只有第二组标题(“Lyon”)处的按钮可见,而另一个(“Reims”)不可见。
该问题显然与 GroupButtons 列表的项目是通过 XAML 定义添加的事实有关。如果我对列表中的项目进行硬编码,它就像一个魅力:
public List<Button> ButtonList
{
get { return new List<Button>()
{
new Button() { Content = "foo" }
}
}
我真的不明白这种行为是从哪里来的。有人有想法吗?