在按钮上打开一个新窗口,单击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

链接地址: http://www.djcxy.com/p/56201.html

上一篇: Opening a new window on button click WPF MVVM

下一篇: Is MVVM pointless?