如何使用UIElement依赖属性实现WPF用户控件?

时间:2012-06-02 22:59:33

标签: c# wpf mvvm dependency-properties uielement

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

/// <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更改为string,我可以让它工作,但我想同时接受stringTextBlock 几乎任何对文本有意义的UIElement

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

请勿在您的控件中使用TextBlock,而是使用ContentPresenter(并绑定Content),它可以托管任何内容。设置属性类型object并将名称更改为Header以保持一致。

(作为旁注:通常您有Header附带的其他属性,即HeaderTemplateHeaderTemplateSelector。如果ContentPresenter在通过将ContentSource设置为"Header"

,您可以将模板绑定到所有三个属性的模板