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



我有一个用户控件,其中包含以下代码:

/// <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

我怎样才能做到这一点?

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

(作为旁注:通常您还有其他与Header相关的属性,即HeaderTemplateHeaderTemplateSelector。如果ContentPresenter位于模板中,则可以通过将ContentSource设置为 "Header" ) 来使其绑定到所有三个属性

相关内容

  • 没有找到相关文章

最新更新