A DependencyProperty
, которое связано со свойством в контексте данных, не вызывает его PropertyChangedCallback
при изменении свойства в контексте данных.
Я настроил тестовую программу для изучения этогофункциональность, в которой у меня есть два класса;один с именем «DependencyObjectTest», который наследует DependencyObject
, а другой с именем «ViewModelTest», который реализует INotifyPropertyChanged
.
Код DependencyObjectTest
выглядит следующим образом:
public class DependencyObjectTest : DependencyObject
{
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value",
typeof(double), typeof(DependencyObjectTest), new PropertyMetadata(0d, ValuePropertyChanged));
public double Value
{
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
private static void ValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is DependencyObjectTest test && e.NewValue is double value)
{
System.Diagnostics.Debugger.Break();
}
}
}
И кодиз ViewModelTest
выглядит следующим образом:
public class ViewModelTest : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private double value = 0d;
public double Value
{
get { return value; }
set
{
if (this.value != value)
{
this.value = value;
NotifyPropertyChanged(nameof(Value));
}
}
}
private void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
PropertyChanged?.Invoke(this, e);
}
}
Вот как я настроил привязку в XAML:
<Window.DataContext>
<local:ViewModelTest/>
</Window.DataContext>
<Window.Resources>
<local:DependencyObjectTest x:Key="testObject" Value="{Binding Value}"/>
</Window.Resources>
У меня есть ползунок, значение которого привязано к Value
контекста данных. Это должно обновить Value
свойство testObject
, но оно не запускает PropertyChangedCallback
, однако, когда я вручную устанавливаю привязку в коде позади, оно срабатывает.
if (DataContext is ViewModelTest test)
{
string propName = nameof(test.Value);
Binding binding = new Binding(propName) { Source = test };
if (Resources["testObject"] is DependencyObjectTest depTest)
BindingOperations.SetBinding(depTest, DependencyObjectTest.ValueProperty, binding);
}
Есть ли что-то, чтоЯ пропал в настройке привязки данных? Спасибо за помощь, спасибо.