在WPF / MVVM应用程序中从主窗口打开第二个窗口

时间:2018-02-22 15:32:16

标签: c# .net wpf mvvm

你能告诉我如何以纯MVVM方式从父窗口调用(我的意思是打开/显示)子窗口。假设我有两个观点:

  1. MainWindow.cs(MainWindow.xaml) - 父窗口(DataContext = new MainWindowViewModel())
  2. Window.cs(Window.xaml) - 子窗口(DataContext = new WindowViewModel())
  3. 相应的ViewModel类:

    1. MainWindowViewModel.cs
    2. WindowViewModel.cs
    3. 我想在按下按钮后打开我的窗口(MainWindow视图上的按钮)。因为我在MainWindow.xaml中定义了命令绑定:

      <Button x:Name="buttonOpenWindow" Content="Open window..." Width="100" Height="20" Command="{Binding OpenWindowCmd}"/>
      

      和MainWindowViewModel.cs一块:

      public ICommand OpenWindowCmd { get; set; }
      
      public MainWindowViewModel()
      {
          OpenWindowCmd = new RelayCommand(o => OpenWindow());
      }
      
      private void OpenWindow()
      {
          // What to put here?
      }
      

      在Window.xaml中我添加了类似的内容:

      <Window x:Class="Namespace.View.Window"
          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"
          xmlns:vm="clr-namespace:Namespace.ViewModel"
          Title="Title" Height="300" Width="325" Visibility="{Binding IsWindowVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
      <Window.Resources>
          <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
      </Window.Resources>
      
      (...)
      

      WindowViewModel.cs:

      using System.ComponentModel;
      using System.Runtime.CompilerServices;
      using Namespace.Annotations;
      
      namespace Namespace.ViewModel
      {
          public class WindowViewModel : INotifyPropertyChanged
          {
              private bool _isWindowVisible;
              public bool IsWindowVisible
              {
                  get { return _isWindowVisible; }
                  set
                  {
                      _isWindowVisible = value;
                      OnPropertyChanged(nameof(IsWindowVisible));
                  }
              }
      
              public event PropertyChangedEventHandler PropertyChanged;
      
              [NotifyPropertyChangedInvocator]
              protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
              {
                  PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
              }
          }
      }
      

      我不知道下一步该做什么以及该方法是否正确。我在论坛中发现了一些服务实现,但我想过只使用Visibility属性(但不确定是否可行)。我需要以某种方式改变我认为的一个视图模型中的IsWindowVisible。谁能建议如何轻轻地处理这种子窗口?

1 个答案:

答案 0 :(得分:0)

如果我理解得很好,你需要这样的东西:

private void OpenWindow()
{
    WindowViewModel wvm = new WindowViewModel();
    Window win = new Window()
    {
        DataContext = wvm;
    };
    win.Show();
}

如果您不喜欢此解决方案,请尝试使用IWindowService的评论中的一个。 无论如何,使用Visibility属性是没有意义的。