Я хочу использовать подход MVVM для достижения чего-то как ниже:
У меня есть MainWindow, где у меня есть 3 Кнопки как: Клиенты a) b) Заказы c) Продажи
Путем нажатия на кнопку это должно открыть свой соответствующий window/usercontrol xaml с клиентскими деталями, подробными сведениями о заказах, деталями продаж.
Я попробовал все, но culdnt способный сделать так.
Как достигнуть этого использования шаблон MVVM. Любезно предоставьте решение?
Спасибо
Ответ зависит от того, как вы хотите отобразить представления Customers, Orders и Sales. Если вы хотите, чтобы они отображались в одном представлении, просто добавьте элемент управления содержимым, привязанный к свойству в вашей основной ViewModel.
Например, если вы используете MVVM Light Toolkit, ваш MainPage.xaml может выглядеть следующим образом...
<UserControl x:Class="MvvmLight2.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Height="300"
Width="300"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Button Content="Customers" Command="{Binding DisplayView}" CommandParameter="Customers" Margin="10" />
<Button Content="Orders" Command="{Binding DisplayView}" CommandParameter="Orders" Margin="10" />
<Button Content="Sales" Command="{Binding DisplayView}" CommandParameter="Sales" Margin="10" />
</StackPanel>
<ContentControl Content="{Binding CurrentView}" IsTabStop="False" Margin="10" />
</StackPanel>
</UserControl>
А ваша модель MainPageViewModel будет...
using System.Windows.Controls;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
namespace MvvmLight2.ViewModel
{
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
DisplayView = new RelayCommand<string>(DisplayViewCommandExecute);
}
#region Commands
public RelayCommand<string> DisplayView { get; private set; }
#endregion
#region CurrentView Property
public const string CurrentViewPropertyName = "CurrentView";
private UserControl _currentView;
public UserControl CurrentView
{
get { return _currentView; }
set
{
if (_currentView == value)
return;
_currentView = value;
RaisePropertyChanged(CurrentViewPropertyName);
}
}
#endregion
private void DisplayViewCommandExecute(string viewName)
{
switch (viewName)
{
case "Customers":
CurrentView = new CustomersView();
break;
case "Orders":
CurrentView = new OrdersView();
break;
case "Sales":
CurrentView = new SalesView();
break;
}
}
}
}
Все это предполагает, что вы создали представления и модели представлений для клиентов, заказов и продаж и изменили ViewModelLocator, чтобы включить их.
На данном этапе, если вам нужно отобразить определенную информацию в дочерних представлениях, вы можете создать зависимое свойство в них и установить его из вашей MainViewModel перед отображением представления.
Возможно, вы захотите рассмотреть шаблон посредника . Общими реализациями являются класс Messenger в MVVM Light Toolkit и Event Aggregation в PRISM.
Один базовый рабочий процесс с использованием этого паттерна... Вызывается команда на viewmodel1. Viewmodel1 регистрирует некоторое сообщение у посредника. Viewmodel2 подписывается на это сообщение и делает что-то в ответ (например, создает новый view2 или изменяет визуальное состояние view2).