我有一个用户控件,其中包含以下代码:
/// <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
,我可以让它工作,但我想接受string
、TextBlock
和几乎任何对文本有意义的UIElement
。
我怎样才能做到这一点?
不要在控件中使用TextBlock
,而是使用ContentPresenter
(并绑定Content
),它可以托管任何内容。使属性类型object
并将名称更改为Header
以保持一致性。
(作为旁注:通常您还有其他与Header
相关的属性,即HeaderTemplate
和HeaderTemplateSelector
。如果ContentPresenter
位于模板中,则可以通过将ContentSource
设置为 "Header"
) 来使其绑定到所有三个属性