2012-06-02 5 views
1

У меня есть пользовательский элемент управления, с помощью этого кода позади:Как реализовать пользовательский контроль WPF с помощью свойств зависимостей 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 в код-сзади, но я хочу принять как string, TextBlock и практически любой UIElement, что имеет смысл для текста.

Как я могу это достичь?

+0

Это свойство изменило обратный вызов, оказалось бесполезным. –

+0

@ H.B. что вы имеете в виду? – Tower

+0

Он ничего не делает. –

ответ

2

Не используйте TextBlock в вашем управлении, а ContentPresenter (и свяжите Content), он может разместить что угодно. Сделайте тип свойства object и измените его на Header для согласованности.

(В качестве побочного примечание: Обычно у вас есть дополнительные свойства, которые идут вместе с Header, а именно HeaderTemplate и HeaderTemplateSelector Если ContentPresenter в шаблоне вы можете сделать его привязку ко всем трем свойствам, установив ContentSource. до "Header")

+0

«TextBlock не соответствует элементу ContentPresenter». Есть что-то особенное, что мне нужно делать? – Tower

+0

@rFactor: Не совсем, просто измените объявление XAML на это: '' и измените тип свойства на 'object'. Как вы получили эту ошибку? Звучит нечетно ... –

+0

Я обновил вопрос с кодом и ошибкой. – Tower