Tabcontrol két aktív lapokat vagy mégsem kívánja megváltoztatni a lap verem túlcsordulás az orosz

@ S.Kost: És ez a probléma. Távolítsuk el a párbeszéd a szetter, kapsz rekurzió: További tulajdonságai érték nem változik, és csak végre a következő iterációval az esemény loop'a. Mit gondol, mi legyen az értéke tekintetében a kiválasztott elem WPF idejére a párbeszéd? - VladD szeptember 27 '16 at 11:19

A probléma abban rejlik, hogy nem blokkolja szetter párbeszéd. Abban az időben a kijelzőn a Tulajdonságok párbeszédablak w kell valamilyen érték, így a kötelező rendszert „s leütött, és dolgozik nem a kívánt módon. Megoldás -, hogy a logika a felbontás változik a lapot a szetter. Ugyanakkor, és szetter lesz univerzálisan alkalmazható. Nos, UI-logika (üzenet box) lehet feltölteni a VM, ami szintén jó.

Tehát látni, amire szüksége van.

Először távolítsa el a hosszú működését szetter. Szetter gyorsnak kell lennie.

Most meg kell tiltani a normál kattintson TabItem „is, és át kell irányítaniuk a kódot. Ehhez szükség van néhány EventTrigger, ami megszünteti az esemény. (Például itt.) De ezt a technikát szállít EventArgs a VM, ahol azok nem tartoznak, így megy keresztül a mellékelt viselkedését. (Igen, ez komoly fegyver, nem találtam másikat.)

A kezdéshez keresztül csatlakozik nuget System.Windows.Interactivity.WPF (Irodalom → jobb egérgombbal → Manage NuGet csomagok. → Search = System.Windows.Interactivity.WPF). Írjunk Magatartás:

Minden egyszerű: ha csatlakozunk feliratkozás PreviewMouseDown a TabItem „, és ha letiltja a megkerülésére, kattintson az érkezés otmeniaem szokásos kezelés révén e.Handled. Miért PreviewMouseDown. Mivel ez az esemény jön hozzánk a hazai feldolgozók, és tudjuk törölni, nem kerülhetnek.

Most az a kérdés merül fel, hogy mi a teendő, ha egy kattintás zadetektirovan? Oké, meg kell hívni a parancsot a VM és a VM úgyhogy dönteni, hogy mit kell csinálni. Hol tart a parancsot, és az érvelés? A válasz nyilvánvaló - keresztül kapcsolódik a csatolt tulajdonság. Ezek csatolt ingatlan lehetne egy külön osztály, de akkor lök RouteClickBehaviour.

Kapunk egy továbbfejlesztett változata:

Az egyetlen finomság - küldünk a parancs aszinkron.

A következő probléma, és hogyan kell hozzáadni egy csatolt viselkedés stílus TabItem. Alkotó volna TabItem viszont nem volt probléma:

(És a csapat át lehetne paraméterekkel). De van egy stílus, de a szállítási viselkedés stílus Bonyolult.

Alapkiépítésben kerülő úton: egy másik csatolt tulajdonság. RouteClickBehaviour kiegészítés a következő:

Most, ha beállítja Adja = true. kívánt viselkedést napellenző automatikusan.

Oké, akkor - mi kell egy csapat a VM, amely eldönti, hogy vagy, hogy nem változik a lap. A parancsok, akkor egy közönséges RelayCommand. Csapat hozott, persze, ott, ahol van modeChangeExecute:

Oké, és a VM-kész részt. Most kösse össze az egészet át XAML.

Állítsa helyi: RouteClickBehaviour.Inject = True. Ha csatlakozni viselkedését. Csapat kell venni a VM TabControl „a, m. K. Döntse nevében külső kapcsoló VM. Paraméterként peredaom helyi VM, amely azt akarja, hogy aktív.

Ellenőrizze. Meg kell dolgozni.

És miért a Tulajdonságok fülre IsSelected bindi? Limit SelectedItem. ez elég lesz. És a vezérlő tulajdonságainál IsSelected itt nem érti. És ha meg kell tudni BM az ingatlan értékét, majd kösse át Mode = OneWay

Ez az, amit tettem. Csak azt mondom, én nem igazán zavarja az építészet, csak nakidal gyorsan :)

És én minden rendben van, a fülek osztják egyesével. A probléma akkor valószínűleg máshol, hogy nem mutatják, azt gondolva, hogy nem kapcsolódik a problémát. Nézd, ha már rendelt a fülek IsSelected = true. Vagy teljesen elvonatkoztatott logika, hagyja csak itt Alapítvány, a többi a dugót, és lassan csatlakoztassa a logika.

Kapcsolódó cikkek