#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 О, вау, я не могу поверить, что прошло почти десять лет! Теперь я чувствую себя старым, лол, я очень рад, что мои ответы все еще полезны! 🙂