WPF DependencyProperty PropertyChangedCallback не вызывается изменениями в связанном источнике - PullRequest
0 голосов
/ 18 октября 2019

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);
}

Есть ли что-то, чтоЯ пропал в настройке привязки данных? Спасибо за помощь, спасибо.

...