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

Имам следното свойство на зависимост:

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
@Клемънс. Защо не? Виждам, че методите за обратно извикване знаят, че трябва да бъдат задействани отново, когато това присвояване е направено, така че защо обвързването не работи? Правя нещо, преди да го променя обратно на false, Това е един вид флаг, който ми трябва просто, за да направя нещо, когато е вярно и след това да го променя обратно на false.   -  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
@JamesLucas. вашите коментари са правилните, които ми помагат! може ли да го качите като отговор.   -  person Hodaya Shalom    schedule 21.05.2015


Отговори (1)


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

person James Lucas    schedule 21.05.2015