Свойство не изменяется в режиме двусторонней привязки со свойством зависимости

У меня есть следующее свойство зависимости:

public bool UndoZoom
        {
            get { return (bool)GetValue(UndoZoomProperty); }
            set { SetValue(UndoZoomProperty, value); }
        }
        // Using a DependencyProperty as the backing store for UndoZoom.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty UndoZoomProperty =
            DependencyProperty.Register("UndoZoom", typeof(bool), typeof(ZoomBehavior), new PropertyMetadata(false, new PropertyChangedCallback(OnUndoZoomChanged)));

В методах обратного вызова я изменяю это свойство на false:

   private static void OnUndoZoomChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        ZoomBehavior zoomBehavior = sender as ZoomBehavior;
        if (zoomBehavior == null || zoomBehavior.UndoZoom == false)
            return;

       //DO SOMETHING... 
        zoomBehavior.UndoZoom = false;

       //ALSO TRY:  zoomBehavior.SetValue(UndoZoomProperty, false);
    }

Свойство зависимости меняется хорошо, а вот свойство привязки к нему нет!

Обвязка выглядит так:

UndoZoom="{Binding MyClass.UndoZoom,Mode=TwoWay}"

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

Я просто не понимаю, почему это не работает и в другую сторону, я ожидаю, что когда я изменю свойство зависимости, свойство в модели также изменится.

Я бы хотел помочь.


person Hodaya Shalom    schedule 21.05.2015    source источник
comment
Установка свойства UndoZoom в его собственном PropertyChangedCallback не имеет смысла. Обратный вызов вызывается при изменении свойства. Вы не должны устанавливать его снова там. Код в обратном вызове выполняется только тогда, когда значение свойства равно true, тогда вы сразу устанавливаете его в false. Чего вы пытаетесь достичь?   -  person Clemens    schedule 21.05.2015
comment
Получаете ли вы какие-либо ошибки привязки при запуске приложения в окне сообщения отладки?   -  person DerApe    schedule 21.05.2015
comment
@ Клеменс. Почему нет? Я вижу, что методы обратного вызова запускаются снова, когда это назначение выполнено, так почему же привязка не работает? Я делаю что-то, прежде чем изменить его обратно на ложь. Это своего рода флаг, который мне нужно просто сделать что-то, когда это правда, а затем изменить его обратно на ложь.   -  person Hodaya Shalom    schedule 21.05.2015
comment
Это должно быть своего рода триггером? Вместо этого вы должны использовать команду.   -  person Clemens    schedule 21.05.2015
comment
@derape. Я написал, что привязка действительно работает.   -  person Hodaya Shalom    schedule 21.05.2015
comment
Что касается предыдущих комментариев об изменении значения свойства в обработчике изменения свойства, обратный вызов принуждения больше подходит для этого. Обратный вызов измененного свойства предназначен для реагирования на изменение значения. Обратный вызов Coercion предназначен для проверки правильности значения на основе текущего состояния, которое больше похоже на то, что вы делаете здесь.   -  person James Lucas    schedule 21.05.2015
comment
@Clemens, потому что по некоторым сложным причинам мне нужно использовать свойство для его выполнения. Команда действительно может быть идеальным решением, но я не могу ее выполнить.   -  person Hodaya Shalom    schedule 21.05.2015
comment
Только что проверил это, и это работает для меня. Из того, что вы показали здесь, проблема не может быть воспроизведена.   -  person Clemens    schedule 21.05.2015
comment
@Clemens, я сейчас проверил это на простом демонстрационном проекте, и у меня это не работает. Вы можете показать, что вы сделали.   -  person Hodaya Shalom    schedule 21.05.2015
comment
Я не сделал ничего особенного, просто объявил ваше свойство зависимостей UndoZoom в моем MainWindow и привязал его двусторонним образом к свойству UndoZoom в классе модели представления. Затем я установил свойство зависимости в обработчике нажатия кнопки. Однако это не работает, как вы ожидаете, когда я устанавливаю для свойства модели представления значение true. PropertyChangedCallback сбрасывает свойство на false, но это изменение не передается обратно в модель представления. Таким образом, свойство VM остается верным. Как было сказано изначально, вы вообще не должны этого делать. Это неправильный подход.   -  person Clemens    schedule 21.05.2015
comment
@ДжеймсЛукас. ваши комментарии - правильный, который помогает мне! Вы можете загрузить его в качестве ответа.   -  person Hodaya Shalom    schedule 21.05.2015


Ответы (1)


Обратный вызов принуждения больше подходит для этого. Обратный вызов измененного свойства предназначен для реагирования на изменение значения. Обратный вызов Coercion предназначен для проверки правильности значения на основе текущего состояния, которое больше похоже на то, что вы делаете здесь.

person James Lucas    schedule 21.05.2015