具有多个datatemplates / contentpresenters的自定义控件

时间:2016-04-18 13:34:06

标签: wpf xaml

在纸牌游戏中,我需要一个控件,在网格中显示4个项目(北,东,南和西)的集合。网格为3x3,分别显示单元格(0,1)(1,0)(1,2)和(2,1)中的内容。

    <bridge:SeatCollection ItemsSource="{Binding Path=Hands}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Path=Name}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </bridge:SeatCollection>

以上我已经开始工作,并且通过创建一个继承自ItemsControl的控件并在GetContainerForItemOverride中执行一些智能操作来完成,如StackOverflow上的另一篇文章所述。

我的问题是如何将另一个属性添加到控件中,该控件包含必须在中间单元格中显示的内容以及控件如何呈现该内容?

使用控件应该是:

    <bridge:SeatCollection ItemsSource="{Binding Path=Hands}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=Name}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <bridge:SeatCollection.MiddleCell>
            <TextBlock Text="Content for middle cell"/>
        </bridge:SeatCollection.MiddleCell>
    </bridge:SeatCollection>

根据这篇文章(http://www.ikriv.com/dev/wpf/displayingcontent/index.html),我可以添加一个属性并在ContentPresenter中使用该属性

    public object MiddleCell
    {
        get { return (object)GetValue(MiddleContentProperty); }
        set { SetValue(MiddleContentProperty, value); }
    }

    public static readonly DependencyProperty MiddleContentProperty =
        DependencyProperty.Register("MiddleCell", typeof(object), typeof(SeatCollection), new PropertyMetadata(0));

但是我可以在代码中的位置和方式将此内容添加到网格的中间单元格中吗?

1 个答案:

答案 0 :(得分:0)

我不知道你在GetContainerForItemOverride中做了什么聪明的事情,所以我只是忽略那部分。你的桥:SeatCollection是一个派生自ItemsControl的自定义控件,对吗?因此它将具有在Themes \ Generic.xaml中定义的默认样式。更改该样式,使其具有ContentPresenter,并将ContentSource设置为MiddleCell(您的DP)。像这样:

<Style TargetType="{x:Type bridge:SeatCollection}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type bridge:SeatCollection}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>

                        <ContentPresenter ContentSource="MiddleCell" Grid.Row="1" Grid.Column="1" />

                        <!-- This is for the 'Hands' - Change as needed -->
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>