Я видел, что у других есть эта проблема, и я могу сказать, что я продублировал несколько вариантов их исправлений, но еще не получил этого, чтобы работать.Зависимость Свойство в пользовательском элементе управления, не обновляющее свойство при изменении данных привязки
Я знаю, что мои связанные данные отправляют соответствующие события 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);
});
Причина объясняется здесь: [Свойства загрузки и зависимости XAML] (https://msdn.microsoft.com/en-us/library/bb613563 (v = vs.110) .aspx) – Clemens
Gotcha, поэтому используйте DP как «концентратор» для всех моих событий и условий и просто используйте свойство для привязки в элементе управления? – Wobbles
@ Wobbles Да, свойство get/set предназначено только для вас, Framework будет использовать DP. – nvoigt