2016-11-18 8 views
0

Я видел, что у других есть эта проблема, и я могу сказать, что я продублировал несколько вариантов их исправлений, но еще не получил этого, чтобы работать.Зависимость Свойство в пользовательском элементе управления, не обновляющее свойство при изменении данных привязки

Я знаю, что мои связанные данные отправляют соответствующие события INotify, потому что я могу привязывать другие элементы управления к данным, подобным текстовым блокам, и видеть, как изменяется его содержимое при изменении свойств объектов, но мой пользовательский элемент управления, похоже, вообще не принимает событие ,

public partial class MappingSelector : UserControl 
{ 
    public Type OutputDriver 
    { 
     get { return (Type)GetValue(OutputDriverProperty); } 
     set { Console.WriteLine(value.ToString()); SetValue(OutputDriverProperty, value); UpdateUI(); } 
    } 

    // Using a DependencyProperty as the backing store for OutPutDriver. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty OutputDriverProperty = 
     DependencyProperty.Register("OutputDriver", typeof(Type), typeof(MappingSelector), new PropertyMetadata(null)); 
    public MappingSelector() 
    { 
     InitializeComponent(); 
     (this.Content as FrameworkElement).DataContext = this; 
     //UpdateUI(); 
    } 
} 

У сеттера есть трассировка консоли, которая никогда не срабатывает, поэтому я уверен, что свойство никогда не устанавливается.

Я тогда привязки к нему с помощью:

<root:MappingSelector OutputDriver="{Binding LoadedProfile.UsedDriverInterface, ElementName=page, UpdateSourceTrigger=PropertyChanged}"/> 

И я знаю, что LoadedProfile.UsedDriverInterface обновляет и посылает соответствующие события, потому что у меня есть это, который работает просто отлично:

<TextBlock Text="{Binding LoadedProfile.UsedDriverInterface, ElementName=page, UpdateSourceTrigger=PropertyChanged}"/> 

Late Edit: Это работает, но это действительно то, что мне нужно сделать? Нет ли лучшего способа? Добавил это в конструктор пользовательского управления;

 var OutputDriverDPD = DependencyPropertyDescriptor.FromProperty(OutputDriverProperty, typeof(MappingSelector)); 
     OutputDriverDPD.AddValueChanged(this, (sender, args) => 
     { 
      OutputDriver = (Type)GetValue(OutputDriverProperty); 
     }); 

ответ

2

сеттер имеет консольный след, который никогда не стреляет, так что я уверен, что свойство никогда не быть установлен.

Это ловушка. Имущество и сеттеры, которые вы определили, предназначены для вашего удобства. WPF Framework не будет их вызывать, он будет использовать свойство зависимости напрямую. Никогда не делайте ничего в тех геттерах и сеттерах, которые вам нужно сделать.

Если вы хотите отреагировать на изменения свойств, используйте обратный вызов, который вы уже обнаружили. Ваша консольная трасса должна быть там, а не в сеттере.

+0

Причина объясняется здесь: [Свойства загрузки и зависимости XAML] (https://msdn.microsoft.com/en-us/library/bb613563 (v = vs.110) .aspx) – Clemens

+0

Gotcha, поэтому используйте DP как «концентратор» для всех моих событий и условий и просто используйте свойство для привязки в элементе управления? – Wobbles

+0

@ Wobbles Да, свойство get/set предназначено только для вас, Framework будет использовать DP. – nvoigt