打开儿童窗口标准

免责声明:我仍然在学习MVVM和WPF,所以这可能只是一个ICommand和RelayCommand的问题。 我没有使用MVVM框架或类似的东西,只是VS2010。

目前我有一个带登录按钮的MainWindow,可以打开一个子窗口。 我已经能够通过使用以下任一方式来实现这一点:

  • 标准ICommand,它具有在Command文件中打开菜单并使用StaticResource绑定和键(ViewModel中无代码)查看XAML的所有代码。
  • 定义标准RelayCommand的RelayCommand命令文件,定义打开子项的RelayCommand“ButtonCommand”的ViewModel,以及定义ViewModel DataContext和ButtonCommand命令绑定的View XAML
  • 是否有一个“适当”或“社区标准”的方式来组织代码? 无论采用哪种方式,我是不是把它设置得不合适?

    方法1: OpenLoginPrompt ICommand File:

    namespace SafetyTraining.Commands
    {
        public class OpenLoginPrompt : ICommand
        {
            public bool CanExecute(object parameter)
            {
                return true;
            }
    
            public event EventHandler CanExecuteChanged
            {
                add { CommandManager.RequerySuggested += value; }
                remove { CommandManager.RequerySuggested -= value; }
            }
    
            public void Execute(object parameter)
            {
                LoginPrompt login = new LoginPrompt();
                login.ShowDialog();
            }
        }
    }
    

    方式2: RelayCommand文件

    namespace SafetyTraining.Commands
    {
        class RelayCommand : ICommand
        {
            private Action<object> _action;
            public RelayCommand(Action<object> action)
            {
                _action = action;
            }
            #region ICommand Members
            public bool CanExecute(object parameter)
            {
                return true;
            }
            public event EventHandler CanExecuteChanged;
            public void Execute(object parameter)
            {
                if (parameter != null)
                {
                    _action(parameter);
                }
            }
            #endregion
        }
    }
    

    MainWindowViewModel

    namespace SafetyTraining.ViewModels
    {
        class MainWindowVM
        {
            private ICommand m_ButtonCommand;
            public ICommand ButtonCommand
            {
                get
                {
                    return m_ButtonCommand;
                }
                set
                {
                    m_ButtonCommand = value;
                }
            }
    
            public MainWindowVM()
            {
                ButtonCommand = new RelayCommand(new Action<object>(LoginOpen));
            }
    
            public void LoginOpen(object obj)
            {
                LoginPrompt login = new LoginPrompt();
                login.ShowDialog();
            }
        }
    }
    

    附加问题:命令是否应该放在单独的CS文件中(我现在正在做什么)或者是模型/视图模型的一部分,还是仅仅是一个偏好问题?


    您应该使用第二个ICommand实现(RelayCommand),因为它是您可以用于任何目的的通用命令,即可以使用此命令实例绑定到任何其他按钮/菜单命令。 第一个是相当严格的,只有一个目的。

    理想情况下,每个新班级都应该放在一个新文件中。 我个人在ViewModel层创建命令文件夹并将命令放在那里。

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

    上一篇: Open Child Window Standard

    下一篇: Viewmodel commandbinding