在按钮上打开一个新窗口,单击WPF MVVM
我正在学习WPF MVVM,并希望在主窗口中单击按钮时打开一个新窗口。
我知道每个View都必须有一个等效的ViewModel,而MVVM的基本原则之一是ViewModel一定不知道任何有关View的内容。
所以,请有人可以提供一个简单的干净的例子,不违反任何MVVM的原则,如何创建两个视图和两个具有以下功能的ViewModel:
通过单击主视图中的按钮显示新视图。
您可以创建一个单独的服务来将视图作为对话框启动,以便在整个应用程序中以通用的方式使用它。 并将通过构造函数将此服务注入ViewModel,该构造函数要启动任何对话框。
public interface IDialogWindowService<T>
{
void Show();
void ShowDialog();
}
public class DialogWindowService<T> : IDialogWindowService<T> where T : Window
{
public void Show()
{
container.Resolve<T>().Show();
}
public void ShowDialog()
{
container.Resolve<T>().ShowDialog();
}
}
您可以创建一个单独的服务来将视图作为对话框启动,以便在整个应用程序中以通用的方式使用它。 并将通过构造函数将此服务注入ViewModel,该构造函数要启动任何对话框。
public interface IDialogWindowService<T>
{
void Show();
void ShowDialog();
}
public class DialogWindowService<T> : IDialogWindowService<T> where T : Window
{
public void Show()
{
container.Resolve<T>().Show();
}
public void ShowDialog()
{
container.Resolve<T>().ShowDialog();
}
}
现在只需将此服务注入相应的视图模型。
public class YourViewModel
{
//commands
public ICommand someCommand { get; set; }
private IDialogWindowService<BookingView> _dialogService;
public YourViewModel(IDialogWindowService<YourView > dialogService)
{
_dialogService = dialogService
someCommand = new RelayCommand(someCommandDoJob, () => true);
}
public void someCommandDoJob(object obj)
{
//Since you want to launch this view as dialog you can set its datacontext in its own constructor.
_dialogService.ShowDialog();
}
}
要么
您可以使用DataTemplates
来更改视图。 它允许根据ViewModel
动态切换Views
:
<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
<Window.Resources>
<ContentPresenter Content="{Binding CurrentView}"/>
</Window>
如果Window.DataContext是ViewModelA的一个实例,则将显示ViewA并且
Window.DataContext是ViewModelB的一个实例,然后将显示ViewB。
我见过的最好的例子是Rachel Lim。 看例子。
过去取得的成功,我所做的就是创建基本上是视图工厂的东西,构建视图并为其分配一个视图模型。 这给了我一个一站式的商店来完成视图,就像您使用IoC一样。
这可能有好处和坏处,所以我很想知道是否有其他更好的方法,但到目前为止,这是我发现的最痛苦的做法。
根据您的使用情况,从视图的代码隐藏中打开视图没有任何问题。 毕竟它仍然是查看代码 。
MyView view = new MyView();
view.Show();
否则,如果您需要从ViewModel
或使用ICommand
打开一个窗口,那么您可以查看我在GitHub上编写的“在MVVM中打开Windows和对话框”库。 这将演示如何通过单击使用MVVM设计模式的按钮来打开Window
。
上一篇: Opening a new window on button click WPF MVVM
下一篇: Is MVVM pointless?