ПредишенСледващото

@ S.Kost: И това е проблемът. Премахване на диалога от инкубатора, можете да получите на рекурсия: Още имоти стойност не се променя, а само да изпълнява следните итерация на loop'a на събитието. Какво мислите, какво трябва да бъде по отношение на стойността на избрания елемент WPF за срока на диалоговия си? - VladD 27 септември '16 в 11:19

Проблемът се състои в това, че се блокира диалог сетер. По времето на дисплея имоти диалогов прозорец W трябва да има някаква стойност, така че подвързване система е съборено, а не работи по желание. Solution - да направи логиката на резолюция промените в раздела от инкубатора. В същото време, както и сетер ще бъде универсално приложим. Е, UI-логика (кутия за съобщения) може да бъде качен от ВМ, което също е добро.

Така че да видим какво имате нужда.

Първо, премахване на дълга работа на инкубатора. Сетер трябва да бъде бързо.

Сега, ние трябва да се забрани от нормалното кликнете TabItem "добре, и да го пренасочи към нашия код. За тази нужда някои EventTrigger, което ще отменят събитието. (Например, тук.) Но тази техника доставя EventArgs в ВМ, в които те не принадлежат, така че проверете прикачения поведение. (Да, това е сериозно оръжие, аз не съм намерил друг.)

За да започнете, се свържете чрез nuget System.Windows.Interactivity.WPF (Позоваването → десния бутон на мишката → Управление NuGet пакети. → Търсене = System.Windows.Interactivity.WPF). Нека пишат Поведение:

Всичко е просто: когато свържете се абонирате за PreviewMouseDown в TabItem "и, ако забраните заобикаляне, кликнете върху пристигането otmeniaem стандартното лечение чрез e.Handled. Защо PreviewMouseDown. Тъй като това събитие идва при нас, за да вътрешните процесори, и ние можем да се откажете от него, не се допуска вътре.

Сега възниква въпросът, какво да се прави, когато кликване zadetektirovan? Добре, трябва да се обадите команда от VM и VM така че нека да реши какво да прави по-нататък. Къде да поеме командването и аргумент? Отговорът е очевиден - прикрепен чрез приложената имота. Това прикрепен собственост могат да бъдат поставени в отделен клас, но може да се бутам в RouteClickBehaviour.

Получаваме подобрена версия:

Единствената тънкост - ние изпращаме команда асинхронно.

Следващият проблем, и как да добавите прикачен поведение чрез стил TabItem. Създадена ще трябва TabItem ръка, не е имало проблеми:

(И екипа могат да бъдат прехвърлени чрез параметри). Но ние имаме стил, но с поведението на доставка чрез стил на сложно.

Хайде стандарт заобиколен начин: чрез друг приложен собственост. RouteClickBehaviour добавка, е следното:

Сега, ако сте задали Инжектират = вярно. желаното поведение тенти автоматично.

Добре, тогава - ние се нуждаем от екип в VM, който ще реши дали да промени Tab. За команди, можете да използвате обикновен RelayCommand. Екип на пут, разбира се, там, където е modeChangeExecute:

Добре, и VM-готов част. Сега изравни заедно през XAML.

Разположен на местно ниво: RouteClickBehaviour.Inject = True. За да се свържете поведение. Отбор, който ще бъде взето от VM за TabControl "а, м. К. Решете от името на външен превключвател VM. Като параметър peredaom местната VM, който иска да стане активен.

Проверете. Той трябва да работи.

И защо имоти раздела подбран Бинди на? Limit SelectedItem. това ще бъде достатъчно. И свойствата на контрола подбран тук, без да ви разбере. И ако трябва да знаете BM стойност на това имущество, а след това го връзвам през Mode = Еднопосочни

Това е, което аз го направих. Просто казвам, аз не съм наистина се занимавам с архитектурата, просто nakidal бързо :)

И аз имам всичко работи добре, разделите са разпределени един по един. Проблемът имате е вероятно някъде другаде, че вие ​​не се появи, мислейки, че това не е свързано с проблема. Вижте къде са възложени на разделите е подбран = вярно. Или напълно абстрахира от логика, оставете само тук тази фондация, създадена на останалата част на щепсела и бавно се свържете логиката.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!