Buduję mój pierwszy WPF przy użyciu wzorca MVVM. Z pomocą tej społeczności udało mi się stworzyć mój Model, mój pierwszy ViewModel i widok. Teraz chcę dodać trochę złożoności do aplikacji projektującej podstawowy interfejs układu aplikacji. Mój pomysł jest mieć co najmniej 2 poglądy dzieci oraz jeden główny widok i rozdzielić je na kilka XAML:WPF Przeglądanie widoków przy użyciu wzorca MVVM
- Main.XAML
- Products.XAML
- Clients.XAML
Główny będzie miał menu i spację, aby załadować widoków podrzędnych (produkty i klientów). Teraz po wzorcu MVVM cała logika nawigacji pomiędzy widokami powinna być zapisana na ViewModelu. Tak mi chodzi o to, aby mieć 4 ViewModels:
- MainViewModel
- ProductsViewModel
- ClientsViewModel
- NavigationViewModel
tak NavigationViewModel powinien zawierać zbiór ViewModels dziecko? i aktywny model podglądu jest tak?
Więc moje pytania to:
1) W jaki sposób można załadować różne widoki (produkty, klienci) na głównym widoku z wykorzystaniem wzorca MVVM?
2) Jak zaimplementować viewModel nawigacji?
3) Jak kontrolować maksymalną liczbę otwartych lub aktywnych widoków?
4) Jak mogę przełączać między otwartymi widokami?
Dużo wyszukiwań i czytania i nie mogłem znaleźć żadnego prostego przykładowego działania nawigacji MVVM z WPF, który ładuje wiele widoków wewnątrz głównego widoku. Wiele z nich:
1) Użyj zewnętrznego zestawu narzędzi, którego nie chcę teraz używać.
2) Umieść cały kod do tworzenia wszystkich widoków w jednym pliku XAML, co nie wydaje się dobrym pomysłem, ponieważ muszę zaimplementować blisko 80 wyświetleń!
Jestem na dobrej drodze? Każda pomoc, zwłaszcza z pewnym kodem, zostanie doceniona.
UPDATE
Więc zbudować projekt testowy następujące rady @LordTakkera, ale utknąć. Jest to, jak wygląda moje rozwiązanie:
tworzę:
Two Models (Clients and Products)
One MainWindow and two wpf user controls(Clients and Products) XAML.
Three ViewModels (Clients, Products and Main ViewModel)
Potem ustawić DataContext na każdego celu odpowiadający ViewModel. Następnie tworzę MainWindow przy pomocy ContentPresentera w taki sposób i wiążę go z właściwością viewmodel.
MainWindow.XAML
<Window x:Class="PruevaMVVMNavNew.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="519" Width="890">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
<RowDefinition Height="*"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<Border Grid.Column="0" Grid.ColumnSpan="2" Background="AntiqueWhite" ></Border>
<Border Grid.Row="1" Grid.RowSpan="2" Background="AliceBlue"></Border>
<Border Grid.Row="1" Grid.Column="1" Background="CadetBlue"></Border>
<ContentPresenter Grid.Row="1" Grid.Column="1" x:Name="ContentArea" Content="{Binding CurrentView}"/>
<StackPanel Margin="5" Grid.Column="0" Grid.Row="1">
<Button>Clients</Button>
<Button>Products</Button>
</StackPanel>
</Grid>
A także to ViewModel od MainWindow:
class Main_ViewModel : BaseViewModel
{
public Main_ViewModel()
{
CurrentView = new Clients();
}
private UserControl _currentView;
public UserControl CurrentView
{
get
{
return _currentView;
}
set
{
if (value != _currentView)
{
_currentView = value;
OnPropertyChanged("CurrentView");
}
}
}
}
Więc to obciążenie domyślnie klientów przeglądać i wygląda tak (co jest po prostu dobrze!):
Więc przypuszczam, że potrzebny jest sposób, aby odnosić się przyciski po lewej stronie, z pewnym viemodel a następnie powiązać je z CurrentView Własności Głównego ViewModel. Jak mogę to zrobić?
Update2
Zgodnie z radą @LordTakkera zmodyfikować mój główny ViewModel w ten sposób:
class Main_ViewModel : BaseViewModel
{
public ICommand SwitchViewsCommand { get; private set; }
public Main_ViewModel()
{
//CurrentView = new Clients();
SwitchViewsCommand = new RelayCommand((parameter) => CurrentView = (UserControl)Activator.CreateInstance(parameter as Type));
}
private UserControl _currentView;
public UserControl CurrentView
{
get
{
return _currentView;
}
set
{
if (value != _currentView)
{
_currentView = value;
OnPropertyChanged("CurrentView");
}
}
}
}
używam RelayCommand zamiast DelegateCommand ale myślę, że to działa w ten sam sposób. Polecenie jest wykonywane, gdy uderzę przycisków a parametr ciąg wpisz jego OK, ale ja dostać ten błąd:
Tłumaczenie: wartość nie może być zerowa. Nazwa parametru: typ. Użyj sugestii Nowe słowo kluczowe do utworzenia instancji obiektu Nie wiem, gdzie umieścić słowo kluczowe Nowe. Próbowałem na CommandParameter, ale to nie zadziała. Dowolny pomysł? Dzięki
UPDATE 3
Po wszystkich rad i pomocy otrzymanych tutaj, i dużo pracy, tutaj jest moja ostateczna menu nawigacji oraz podstawa dla mojego interfejsu aplikacji.
Przyjemna aplikacja Eric.I do nowego do wpf. Próbuję zaprojektować aplikację z tym samym układem. Czy mógłbyś napisać kod. To byłoby bardzo pomocne, aby uzyskać więcej wiedzy. – Oasis