Не удается привязать присоединенное свойство к другому свойству зависимости

#c# #wpf #xaml #binding #attached-properties

#c# #wpf #xaml #привязка #прикрепленные свойства

Вопрос:

Я пишу библиотеку элементов управления. В этой библиотеке есть несколько пользовательских панелей, которые заполняются пользовательскими 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>
  

будет выдано исключение: «‘Привязка’ не может быть установлена для свойства ‘setTitle’ типа ‘Label’. «Привязка» может быть установлена только для DependencyProperty объекта DependencyObject.»

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

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

Комментарии:

1. Привет, mylibcommon properties должны быть производными от DependecyObject

2. Просто предположение, но измените ваши параметры Get / setTitle first на DependencyObject , а не UIElement. Также при регистрации вашего свойства Attache третьим параметром должен быть владелец присоединенного свойства, а не желаемая цель. Измените его на MyLibCommonProperties.

3. Что такое HorizontalShelf ? Вы пробовали это в StackPanel или подобном встроенном элементе управления вместо этого? Все остальное кажется прекрасным. Я могу только предположить, HorizontalShelf что это пользовательский элемент управления, который не распознает своих дочерних элементов как логических дочерних элементов. Смотрите здесь: kentb.blogspot.com/2008/10/customizing-logical-children.html

Ответ №1:

Замените 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()

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

Комментарии:

1. Рейчел, это не первый раз, когда один из ваших ответов помогает мне! (и я уверен, что это не будет последним). Даже спустя почти десятилетие.

2. @UuDdLrLrSs О, вау, я не могу поверить, что прошло почти десять лет! Теперь я чувствую себя старым, лол, я очень рад, что мои ответы все еще полезны! 🙂