Переключить два представления (Windows) в MVVM WPF - PullRequest
1 голос
/ 05 октября 2011

Я занимаюсь разработкой приложения, имеющего 2 режима

  1. Режим конфигурации
  2. Режим выполнения

Оба режима откроются в новом окне.Я уже сделал окно конфигурации.

Мне нужно переключаться между 2 режимами, нажимая Key F12 или что-то в этом роде .... также я должен запрашивать пароль у пользователя при переключении из режима выполнения в режим конфигурации(Только один раз за сеанс) я сделал экран пароля и внедрил его в конфигурацию.

Я также обеспокоен тем, что использовал Messenger (шаблон Meaditor), поэтому закрытие и открытие 2 разных окон снова зарегистрирует делегатов, и снова ... и я запускаю Modal windows.

Также нужно ли поддерживать оба вида живыми, или я могу убить одного из них при переключении.

Полностью смущен реализацией ...

Мой App.Xaml Code

 /// <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 Ответ

4 голосов
/ 05 октября 2011

Ваша реализация не выглядит для меня совершенно неверной.

Если бы я получил требование переключаться между двумя видами модального окна нажатием клавиши, то я бы пошел по пути 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>
    

Эти шаблоны данных можно хранить в разных файлах ресурсов и объединятьсловари ресурсов для ресурсов окна.

  1. Создайте отдельную модель представления с записываемым свойством Mode. Реализуйте 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 ...
    }
    

В приведенном выше коде DelegateCommand не найден внутри API .Net. Получите их реализацию из Интернета.

  1. Зарегистрируйте KeyBinding для F12 в окне.1039 * для F12 KeyBinding взято из ViewModel.

    <Window.InputBindings>
        <KeyBinding Command="{Binding ChangeModeCommand}"
                    Key="F12" />
    </Window.InputBindings>
    

В версиях, предшествующих .Net 4.0, свойство Command не является привязываемым. Use CommandReference для этого.

  1. OnModeChange () для клавиши F12, переключение Mode из класса ViewModel и повышение свойства с уведомлением.

  2. Имеют триггеры данных на ContentControl на Window.триггеры проверяют Mode, если это «Config», и изменяют ContentTemplate на «Config», шаблон данных, или изменяют на «Data Execution».

       <ContentControl Content="{Binding}">
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Mode}" Value="Config">
                        <Setter Property="ContentTemplate"
                                Value="{StaticResource ConfigView}"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Mode}" Value="Execution">
                        <Setter Property="ContentTemplate"
                                Value="{StaticResource ExecutionView}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
      </ContentControl>
    

Надеюсь, мой путь в некотором смысле поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...