Не удается связать вложенное свойство с другим свойством зависимости - PullRequest
9 голосов
/ 11 ноября 2011

Я пишу контрольную библиотеку.В этой библиотеке есть несколько пользовательских панелей, которые заполнены пользовательскими UIElements.Поскольку каждый дочерний элемент в моей библиотеке должен иметь свойство «Title», я написал следующее:

// Attached properties common to every UIElement
public static class MyLibCommonProperties
{
    public static readonly DependencyProperty TitleProperty =
        DependencyProperty.RegisterAttached( 
            "Title", 
            typeof(String),
            typeof(UIElement), 
            new FrameworkPropertyMetadata(
                "NoTitle", new PropertyChangedCallback(OnTitleChanged))
            );

    public static string GetTitle( UIElement _target )
    {
        return (string)_target.GetValue( TitleProperty );
    }

    public static void SetTitle( UIElement _target, string _value )
    {
        _target.SetValue( TitleProperty, _value );
    }

    private static void OnTitleChanged( DependencyObject _d, DependencyPropertyChangedEventArgs _e )
    {
       ...
    }
}

Затем, если я напишу это:

<dl:HorizontalShelf>
    <Label dl:MyLibCommonProperties.Title="CustomTitle">1</Label>
    <Label>1</Label>
    <Label>2</Label>
    <Label>3</Label>
</dl:HorizontalShelf>

, все работает нормально, исвойство получает указанное значение, но если я попытаюсь привязать это свойство к какому-либо другому UIElement DependencyProperty, например:

<dl:HorizontalShelf>
    <Label dl:MyLibCommonProperties.Title="{Binding ElementName=NamedLabel, Path=Name}">1</Label>
    <Label>1</Label>
    <Label>2</Label>
    <Label Name="NamedLabel">3</Label>
</dl:HorizontalShelf>

, будет выдано исключение: «Binding» не может быть установлен для «SetTitle»свойство типа «Метка». «Связывание» может быть установлено только для свойства DependencyProperty объекта DependencyObject. "

Чего мне не хватает?Привязка работает нормально, если вместо привязки к «Имени» я привязываю к какому-либо другому прикрепленному свойству, определенному в MyLibCommonProperties.

Заранее спасибо.

1 Ответ

13 голосов
/ 11 ноября 2011

Замените UIElement в вашем определении DependencyProperty на MyLibCommonProperties

public static readonly DependencyProperty TitleProperty =
    DependencyProperty.RegisterAttached( 
        "Title", 
        typeof(String),
        typeof(MyLibCommonProperties), // Change this line
        new FrameworkPropertyMetadata(
            "NoTitle", new PropertyChangedCallback(OnTitleChanged))
        );

Я думаю, это может быть потому, что привязка неявно использует родительский класс, указанный для вызова SetTitle(), поэтому она вызывает Label.SetTitle() вместо MyLibCommonProperties.SetTitle()

У меня была такая же проблема с некоторыми пользовательскими свойствами TextBox.Если бы я использовал typeof(TextBox), я бы не смог привязать значение, но если бы я использовал typeof(TextBoxHelpers), я мог бы

...