在ControlTemplate中绑定的列表元素仅呈现一次

时间:2016-01-26 13:44:12

标签: c# wpf xaml controltemplate xceed-datagrid

我有一个包裹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”中渲染此列表的按钮,它基本上是一个分组行,如下所示:

enter image description here

为实现这一目标,我已经覆盖了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的每个实例渲染按钮,而是只渲染一次。为了说明,想象一下,在上面的图像中,只有第二组标题(“里昂”)的按钮可见,而另一个(“兰斯”)则没有。

问题显然与GroupButtons列表的项目是通过XAML定义添加的事实有关。如果我硬编码列表中的项目,它就像一个魅力:

public List<Button> ButtonList
{
    get { return new List<Button>()
    {
        new Button() { Content = "foo" }
    }
}

我真的没有得到这种行为的来源。有人有想法吗?

0 个答案:

没有答案