在WPF DataTemplate中放置一个ContentControl?

3
我有一个自定义的展开控件叫做SpecialExpander。它基本上只是一个带有花哨标题和一些属性(HeaderTextIsMarkedRead)的标准Expander
我开始创建一个简单的类:
public class SpecialExpander : Expander
{
    public string HeaderText { get; set; }
    public bool IsMarkedRead { get; set; }
}

然后我创建了一个样式,设置了扩展器上的一些属性(例如间距、填充等),并且重要的是,它还为HeaderTemplate属性定义了一个自定义DataTemplate。该模板基本上是一个具有两行的网格。
如下图所示...
- 对于顶部行,我希望使用固定布局(它始终是TextBlock TextBlock CheckBox) - 然而,对于底部行,我想能够为每个扩展器提供自定义的XAML。
我尝试将放入DataTemplate中,但我无法正确地连接它。

alt text http://img85.imageshack.us/img85/1194/contentcontrolwithintem.jpg

这段内容展示了一个图片链接,用于演示如何在编程中控制内容。

alt text


问题

我如何为我的SpecialExpander构建一个DataTemplate,使得标题有一些固定的内容(顶部行)和自定义内容的占位符(底部行)?

对于第二个示例,我希望能够做到以下操作:

<SpecialExpander HeaderText="<Expander Header Text>" IsMarkedRead="True">
    <SpecialExpander.Header>
        <StackPanel Orientation="Horizontal">
            <RadioButton Content="High" />
            <RadioButton Content="Med" />
            <RadioButton Content="Low" />
        </StackPanel>
    <SpecialExpander.Header>
    <Grid>
        <Label>Main Content Goes Here</Label>
    </Grid>
</SpecialExpander>
1个回答

2
今天早上我突然想到了解决方法:不需要创建一个SpecialExpander,只需要创建一个普通的Expander。然后,对于头部,我将使用一个名为SpecialExpanderHeader的自定义ContentControl
以下是它的工作原理... SpecialExpanderHeader类:
public class SpecialExpanderHeader : ContentControl
{
    public string HeaderText { get; set; }
    public bool IsMarkedRead { get; set; }
}

SpecialExpanderHeader 样式:

<Style TargetType="custom:SpecialExpanderHeader">
    <Setter Property="Padding" Value="10" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="custom:SpecialExpanderHeader">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="5" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <StackPanel Grid.Row="0" Orientation="Horizontal">
                        <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=custom:SpecialExpanderHeader}, Path=HeaderText}" />
                        <CheckBox Margin="100,0,0,0" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=custom:SpecialExpanderHeader}, Path=IsMarkedRead}" />
                    </StackPanel>
                    <Separator Grid.Row="1" />
                    <ContentPresenter Grid.Row="2" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

扩展器样式

<Style x:Key="Local_ExpanderStyle" TargetType="Expander" BasedOn="{StaticResource {x:Type Expander}}">
    <Setter Property="Margin" Value="0,0,0,10" />
    <Setter Property="Padding" Value="10" />
    <Setter Property="FontSize" Value="12" />
</Style>

使用方法

<Expander Style="{StaticResource Local_ExpanderStyle}">
    <Expander.Header>
        <custom:SpecialExpanderHeader IsMarkedRead="True" HeaderText="Test">
            <StackPanel Orientation="Horizontal">
                <RadioButton Content="High" />
                <RadioButton Content="Medium" />
                <RadioButton Content="Low" />
            </StackPanel>
        </custom:SpecialExpanderHeader>
    </Expander.Header>
    <Grid>
        <!-- main expander content goes here -->
    </Grid>
</Expander>

我喜欢这种情况发生的时候 :) - Alastair Pitts
你好,如果可以的话,能否与我们分享整个示例应用程序,这样每个人都可以享受代码? - SharpUrBrain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接