【问题标题】:Putting a ContentControl *inside* a WPF DataTemplate?将 ContentControl *inside* WPF DataTemplate?
【发布时间】:2010-01-20 07:48:39
【问题描述】:

我有一个名为SpecialExpander 的自定义扩展器控件。它基本上只是一个标准的Expander,带有一个花哨的标题和几个属性(HeaderTextIsMarkedRead)。

我从创建一个简单的类开始:

public class SpecialExpander : Expander
{
    public string HeaderText { get; set; }
    public bool IsMarkedRead { get; set; }
}

然后我创建了一个样式,在扩展器上设置了几个属性(例如,边距、填充等),重要的是,它还为 HeaderTemplate 属性定义了一个自定义 DataTemplate。模板基本上是一个有两行的网格。

如下图所示……

  • 对于顶行,我想要一个固定的布局(总是TextBlockTextBlockCheckBox
  • 但是,对于最后一行,我希望能够为每个扩展器提供自定义 XAML。

我尝试将<ContentControl Grid.Row="1" ... /> 放入DataTemplate,但我不知道如何正确连接。


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



问题

如何为我的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>

【问题讨论】:

    标签: c# wpf xaml templates wpf-controls


    【解决方案1】:

    今天早上我想到了如何解决这个问题:我只需要一个普通的Expander,而不是构建一个SpecialExpander。然后,对于标题,我将使用自定义的 ContentControl,称为 SpecialExpanderHeader

    这是它的工作原理......

    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>
    

    【讨论】:

    • 我喜欢这种情况:)
    • 您好,如果您没问题,您能与我们分享整个示例应用程序,以便每个人都可以享受代码吗?
    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多