@ S.Kost: Și asta e problema. Scoateți dialogul din setter obțineți recursie: Mai multe proprietăți de valoare nu este schimbat, și de a efectua doar următoarea repetare a evenimentului loop'a. Ce credeți că ar trebui să fie valoarea elementului selectat din punctul de vedere al WPF pe durata casetei dvs. de dialog? - VladD 27 Sep '16 la 11:19 am
Problema este că blocați dialogul setter. La momentul în care este afișat dialogul, proprietatea lui x trebuie să aibă un anumit sens, astfel încât sistemul de legare este doborât și nu funcționează așa cum ne-ar plăcea. Soluția este de a face logica pentru a permite schimbarea tutunului de la setter. În același timp, dispozitivul de setare va deveni universal aplicabil. Ei bine, logica UI (caseta de mesaje) poate fi descărcată de la VM, ceea ce nu este, de asemenea, rău.
Deci, uite ce ai nevoie.
Mai întâi, eliminăm operațiunile lungi de la setter. Setter-ul trebuie să fie rapid.
Acum, trebuie să dezactivați clicul standard al TabItem și să îl redirecționăm spre codul nostru. Pentru aceasta, aveți nevoie de un EventTrigger, care ar anula evenimentul. (De exemplu, ca aici). Dar această tehnică va furniza EventArgs către VM, în care nu aparțin, așa că hai să trecem prin comportamentul atașat. (Da, aceasta este o arma serioasa, nu am gasit altul.)
Pentru a începe, conectați prin nuget System.Windows.Interactivity.WPF (Referințe → butonul din dreapta al mouse-ului → Administrare pachete NuGet. → Căutare = System.Windows.Interactivity.WPF). Scrie comportamentul:
Aici totul este simplu: atunci când ne conectăm, ne abonați la PreviewMouseDown de la TabItem și atunci când dezactivați dezabonarea, atunci când se primește clicul, anulam procesarea standard prin e.Manual. De ce PreviewMouseDown. Deoarece acest eveniment vine la noi la operatorii interni și îl putem anula fără să-l lăsăm înăuntru.
Acum apare întrebarea și ce trebuie făcut atunci când este detectat un clic? Bine, trebuie să apelați o comandă de la VM și să lăsați VM să decidă ce să facă în continuare. În cazul în care pentru a obține echipa și argumentul? Răspunsul este evident - atașați prin proprietate atașată. Aceste proprietăți atașate ar putea fi plasate într-o clasă separată, dar puteți, de asemenea, să o inserați în RouteClickBehavior.
Obțineți o versiune îmbunătățită:
Singura subtilitate este aceea că trimitem comanda asincron.
Următoarea problemă este cum să adăugați comportamentul atașat prin stilul din TabItem. Ne-ar crea manual TabItem, nu ar exista probleme:
(și comanda ar putea fi trecută prin parametri). Dar avem un stil, iar cu livrarea comportamentului prin stil, totul este complicat.
Să mergem cu bypass-ul standard: printr-o altă proprietate atașată. Să adăugăm RouteClickBehavior aici:
Acum, dacă setați Inject = true. comportamentul dorit va fi atârnat automat.
Bine, în continuare - avem nevoie de o comandă în VP, care va decide dacă va schimba tab-ul sau nu. Pentru comenzi, puteți folosi un Comandă Relay obișnuită. Comanda pe care o vom plasa, evident, acolo unde se află modeChangeExecute:
Bine, și partea VM este gata. Acum o vom conecta împreună prin XAML.
Instalați local: RouteClickBehaviour.Inject = Avertisment. pentru a conecta comportamentul. Comanda ar trebui să fie luată de la VM pentru TabControl 'a, deoarece problema de comutare este VM extern. Ca parametru, trecem acel VM local, care dorește să devină activ.
Verificați. Ar trebui să lucreze.
Și ce, în general, în proprietățile IsSelected? Limita SelectedItem. acest lucru va fi de ajuns. Și cu proprietățile IsSelected controlul aici fără să înțelegi. Și dacă trebuie să cunoașteți valoarea acestei proprietăți în VM, atunci legați-o în Mod = OneWay
Asta am primit. Imediat spun, nu m-am deranjat cu arhitectura, am schițat-o mult mai repede :)
Și la mine totul funcționează perfect, filele sunt alocate pe una. Problema pe care o aveți probabil este în altă parte pe care nu ați arătat-o, gândindu-vă că nu are nimic de a face cu problema. Căutați unde sunteți alocați fișierelor IsSelected = true. Sau ignorați complet logica, lăsați doar aceasta, setând restul conectorilor și conectând lent logica.