1

我有一个用户控件,后面有这段代码:

/// <summary>
/// The text to use for the header.
/// </summary>
public UIElement HeaderText
{
    get { return (UIElement) GetValue(HeaderTextProperty); }
    set { SetValue(HeaderTextProperty, value); }
}

public static DependencyProperty HeaderTextProperty =
    DependencyProperty.Register("HeaderText",
                                typeof(UIElement),
                                typeof(Panel),
                                new PropertyMetadata(null, new PropertyChangedCallback(HeaderTextPropertyChanged)));

private static void HeaderTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var control = d as Panel;
    if (control != null)
    {
        control.HeaderText = (UIElement) e.NewValue;
    }
}

而这个 XAML:

<TextBlock Text="{TemplateBinding local:CustomPanel.HeaderText}" />

我正在尝试像这样使用用户控件:

<controls:CustomPanel>
    <controls:CustomPanel.HeaderText>
        <TextBlock Text="Foo " />
        <TextBlock Text="{Binding Bar}" />
        <TextBlock Text=" baz." />
    </controls:CustomPanel.HeaderText>
</controls:CustomPanel>

但是,我得到的是空白/空文本。

UIElement如果我更改为stringin code-behind,我可以让它工作,但我想接受这两者stringTextBlock以及几乎任何UIElement对文本有意义的东西。

我怎样才能做到这一点?

4

1 回答 1

2

不要TextBlock在您的控件中使用 a 而是 a ContentPresenter(并绑定Content),它可以托管任何东西。制作属性类型object并将名称更改为以Header保持一致性。

(作为旁注:通常你有额外的属性Header,即 aHeaderTemplate和 a HeaderTemplateSelector。如果在模板中,你可以通过设置toContentPresenter使其绑定到所有三个属性)ContentSource"Header"

于 2012-06-02T23:02:01.017 回答