Witam, mam pewne rozwiązanie które mi działa. I teraz chce się spytać czy jest to zgodne z wzorcami projektowymi, a jak nie to czy istnieje inne rozwiązanie.
Opis działania Aplikacji. Po zalogowaniu aplikacja powinna posiadać główne okno obszar roboczy z dostępem do paru przycisków wyłącznie za pomocą które możemy zmieniać widoki lub się wylogować z aplikacji. Dodatkowo na większym obszarze ma być prezentowane jakieś nie istotne informacje. Bazujące na kolekcjach obiektów, ale to nie istotne w moim pytaniu.
Kiedyś robiłem coś podobnego i wiozłem sobie rozwiązanie iż pod strony będą w UsersControl i było to wyświetlane na pewnym gridzie. Ok wszystko fajnie bo też zmieniałem widoku z poziomu głównego okna. Obecnie mam pewną komplikację.
Widoki UC muszą się zmieniać z Poziomu UC gdy ktoś skończy wypełniać formularz, muszą przeskoczyć na następny. Niestety możliwości przeskoku pomiędzy nie mogą być po stronie głównego okna. Więc zrobiłem pewne rozwiązanie działające w każdym przypadku i teraz pytanie, czy jest poprawne.
Stworzyłem sobie pewną classe odpowiedzialną za zmianę widoku wygląda następująco.
public class AppViewUC_Change
{
private string Uc_Category; // Rodzaj Uc jaki chcemy otworzyc
private UserControl viewState; // przypisanie stworzone UC, nasze style dziedziczą po UserControl
private Grid viewPanel; // Grid na którym ma się to wyświetlić
/// <summary>
/// Tworzenie instancji klasy
/// </summary>
/// <param name="_viewPanel">Grid na którym ma się to wyświetlać</param>
public AppViewUC_Change(Grid _viewPanel)
{
this.viewPanel = _viewPanel; // Przypisanie grida
}
public void TeakChangeViewsw(string changedWindowState)
{
Uc_Category = changedWindowState;
}
/// <summary>
/// Wybiera konkretny przesłany parametr w stringu i ustawia go na UC
/// </summary>
/// <param name="viewss">nazwa UC jaką chcemy przypisać</param>
public void ChangedViews(AppViewUC_Change viewss)
{
if (Uc_Category == "UC_Category")
{
viewState = new UC_Category(viewss);
ChangedThisViewState();
}
if (Uc_Category == "UC_StyleTest")
{
viewState = new UC_StyleTest(viewss);
ChangedThisViewState();
}
}
/// <summary>
/// Funkcja zmiany childrena w naszym przesłanym gridzie
/// </summary>
private void ChangedThisViewState()
{
viewPanel.Children.Add(viewState);
}
ChangedViews(); w tej funkcji zostanie użyty switch to jest sposób poglądowy i testowy na szybko do sprawdzenia czy działa.
Inicjacja okna głównego parametr View_Uc to nazwa mojego grida ;)
public partial class WindowLinker :Window
{
private AppViewUC_Change viewss; // Stworzenie obiektu z klasy AppiViewUc_Changed
public WindowLinker()
{
InitializeComponent();
Uc_ControlMove(); // Wywołanie wyświetlenia danego Uc
}
/// <summary>
/// Funkcja generująca możliwość przechodzenia między oknami w UC / Moja innowacja ;)
/// </summary>
private void Uc_ControlMove()
{
// Tworzy nam obiekt viewss. Tworzymy go tylko za pierwszym razem
viewss = new AppViewUC_Change(View_Uc); // Tworzy pierwszy raz obiekt. Który potem jest przesyłany między uc
// podajemy parametr grida w którym będzie wyświetlany dany UC
// Potem jest to samo
viewss.TeakChangeViewsw("UC_StyleTest"); // Wybieramy rodzaj okna jaki ma się wyświetlić
viewss.ChangedViews(viewss); // Odpowiada za zmiane widoku oraz koniecznie przesyłamy całą klasę dalej żeby móc potem do okna głownego odwołać
}
}
Oraz poglądowe 2 classy UC
public partial class UC_StyleTest :UserControl
{
private AppViewUC_Change viewss;
public UC_StyleTest(AppViewUC_Change _viewss)
{
InitializeComponent();
this.viewss = _viewss;
}
private void button_Click(object sender, RoutedEventArgs e)
{
//Testujemy
viewss.TeakChangeViewsw("UC_Category");
viewss.ChangedViews(viewss);
}
}
public partial class UC_StyleTest :UserControl
{
private AppViewUC_Change viewss;
public UC_StyleTest(AppViewUC_Change _viewss)
{
InitializeComponent();
this.viewss = _viewss;
}
private void button_Click(object sender, RoutedEventArgs e)
{
//Testujemy
viewss.TeakChangeViewsw("UC_Category");
viewss.ChangedViews(viewss);
}
}
Tak jak mówię wszystko działa i z poziomu UC jestem wstanie przejść do 2 UC wyświetlanego w oknie głównym.
I teraz pytanie czy jest to poprawny sposób czy są inne rozwiązania. Nigdzie takiego sposobu jaki zaprezentowałem nie widziałem, prawdopodobnie nie tylko ja go stosuję. Lecz nie wiem dla czego mam dziwne wrażenie że jest to zrobione na krzywy pysk. MVVM jak ktoś powie, nie jestem wstanie zrobić z 2 powodów zbyt dużo widoków oraz kolekcji które muszą być powiązane z sobą akcjami po 2 jest cienki bolek w MVVM jeżeli chodzi o wielopoziomowe aplikacje, zresztą mam problemy z podpięciem akcji za pomocą bidingów w kolekcjach.