Прежде всего, да, вы хотите прикрепленное свойство.Но вы не реализуете шаблон правильно.
Никогда не помещайте никакую логику в ваши методы GetXxxx () или SetXxxx ().GetXxxx и SetXxxx должны содержать только вызовов GetValue и SetValue соответственно:
public static String GetAdsName(UIElement element)
{
return (string) element.GetValue(AdsNameProperty);
}
public static void SetAdsName(UIElement element, String value)
{
element.SetValue(AdsNameProperty, value);
}
Почему они не должны содержать никакой другой логики?Потому что при загрузке XAML ваш метод SetXxxx не будет вызываться.У команды WPF был выбор: они могли бы заставить загрузчик XAML использовать Reflection, чтобы найти ваш метод SetXxxx, и динамически вызывать его во время выполнения, чтобы ваш метод мог вызвать SetValue;или они могли бы удалить посредника и просто вызвать SetValue напрямую.Они выбрали последний вариант, потому что он намного проще и эффективнее.
Если вы хотите, чтобы побочные эффекты были установлены, когда вы задали свойство, вам нужно указать propertyChangedCallback
при создании PropertyMetadata.В вашем случае:
public static readonly DependencyProperty AdsNameProperty =
DependencyProperty.RegisterAttached("AdsName",
typeof(String), typeof(AdsNameRegistry),
new FrameworkPropertyMetadata("",
FrameworkPropertyMetadataOptions.AffectsRender, OnAdsNameChanged));
private static void OnAdsNameChanged(DependencyObject sender,
DependencyPropertyChangedEventArgs e)
{
// do something with the new value
}