在MVVM WPF中切换两个视图(Windows)

时间:2011-10-05 04:36:16

标签: wpf mvvm

我正在开发一个具有2种模式的应用程序

  1. 配置模式
  2. 执行模式
  3. Boths模式将在新窗口中打开。我已经完成了配置窗口。

    我需要通过按Key F12或类似的东西在两种模式之间切换....我也必须提示用户输入密码,同时从执行切换到配置模式(只需一次durnig会话)我有制作了密码屏幕并在配置中实现。

    我也很担心因为我使用了Messenger(Meaditor模式)所以关闭并打开2个不同的窗口会再次注册代表...我正在启动Modal windows

    我们还需要让两个视图保持活动状态,否则我可以在切换时杀死其中一个视图。

    完全混淆了实施......

    我的App.Xaml代码

     /// <summary>
        ///   Application_Startup
        /// </summary>
        /// <param name = "sender"></param>
        /// <param name = "e"></param>
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            log.Debug("Application_Startup  " + Utility.FUNCTION_ENTERED_LOG);
            try
            {
    
                    if (e.Args.Length == 0)
                    {
                        AboutDialog.SpashScreen(Utility.TOOL_NAME,
                                                Utility.TOOL_VERSION);
                        MainView mainForm = new MainView();
                        mainForm.ShowDialog();
                    }
                    else
                    {
                        string key = null;
                        foreach (string arg in e.Args)
                        {
                            if (arg.StartsWith("-"))
                            {
                                //this is a key         
                                key = arg;
                                if (key.Equals("-config"))
                                {
                                    CommandLineArgs.Add(key, "config");
                                    break;
                                }
                                if (key.Equals("-start"))
                                {
                                    CommandLineArgs.Add(key, "start");
                                }
                            }
                            else
                            {
                                //should be a value        
                                if (key == null)
                                {
                                    throw new Exception(
                                        "The command line arguments are malformed.");
                                }
                                CommandLineArgs.Add(key, arg);
                                key = null;
                            }
                        }
                        string config = string.Empty;
                        foreach (object k in App.CommandLineArgs.Keys)
                        {
                            config += CommandLineArgs[k].ToString();
                        }
    
                        switch (config)
                        {
                            case "config":
                                AboutDialog.SpashScreen(
                                    Utility.TOOL_NAME,
                                    Utility.TOOL_VERSION);
                                MainView mainForm = new MainView();
                                mainForm.ShowDialog();
                                break;
                             case "start" :
                                   ExecutionForm execuForm= new ExecutionForm();
                                   execuForm.ShowDialog();
                                   break;
                            default:
                                MessageBox.Show("Incorrect Parameters",
                                                Utility.TOOL_NAME);
                                Application.Current.Shutdown();
                                break;
                        }
    
                }
                log.Debug("Application_Startup" + Utility.FUNCTION_EXIT_LOG);
            }
            catch (Exception ex)
            {              
                log.Error("Application_Startup" + ex.Message, ex);
            }
        }
    

1 个答案:

答案 0 :(得分:4)

你的实施对我来说并不是完全错误的。

如果我需要通过按键按下模态窗口上的两个视图之间的切换,那么我就会采用MVVM方式......

  1. 使用单一模态窗口来定位托管多个内容。
  2. 在窗口上有ContentControl。将Content绑定到DataContext

    <DockPanel LastChildFill="true">
        <Menu DockPanel.Dock="Top" ...>
        </Menu>
        <ContentControl Content="{Binding}" ... />
    </DockPanel>
    
  3. 创建两个数据模板作为资源。一个数据模板对应于“配置”视图,而其他数据模板用于“执行”视图。

    <Window.Resources>
         <DataTemplate x:Key="ConfigView" ... />
         <DataTemplate x:Key="ExecutionView" ... />
    </Window.Resources>
    
  4. 您可以将这些数据模板保存在不同的资源文件中,并将资源字典合并到窗口资源中。

    1. 创建一个具有可写Mode属性的ViewModel。实施INotifyPropertyChanged。

      public class ViewModel : INotifPropertyChanged
      {
          private string mode;
      
          public string Mode
          {
               get  { return mode; }
               set  { mode = value; NotifPropertyChanged("Mode"); }
          }
      
          private IComamnd changeModeCommand;
      
          public ICommand ChangeModeCommand
          {
              get
              {
                  if (changeModeCommand == null)
                       changeModeCommand
                          = new DelegateCommand(
                               OnModeChange,
                               CanModeChange);
                  return changeModeCommand;
              }
          }
      
          //// Other properties and functions go here ...
      }
      
    2. 在上面的代码中,{。1}}内部找不到.Net API。从互联网上获取它们的实现。

      1. 在窗口上为DelegateCommand注册KeyBinding。 F12 F12的{​​{1}}来自Command

        KeyBinding
      2. 在.Net 4.0之前的版本中,ViewModel属性不可绑定。请使用CommandReference

        1. <Window.InputBindings> <KeyBinding Command="{Binding ChangeModeCommand}" Key="F12" /> </Window.InputBindings> 键的OnModeChange(),从Command类切换F12并提升属性更改通知。

        2. Mode上的ViewModel上有数据触发器。在数据触发器中,检查ContentControl是否为“Config”,并将Window更改为“Config”数据模板,将其更改为“Execution”datatemplate。

          Mode
        3. 我希望在某种意义上我的方式可以帮助你。