0

免责声明:我仍在学习 MVVM 和 WPF,所以据我所知,这可能只是一个 ICommand 与 RelayCommand 的问题。我没有使用 MVVM 框架等,只是 VS2010。

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

  • 标准 ICommand 具有用于在命令文件中打开菜单和使用静态资源绑定和键查看 XAML 的所有代码(ViewModel 中没有代码)
  • 定义标准 RelayCommand 的 RelayCommand 命令文件、定义打开子的 RelayCommand“ButtonCommand”的 ViewModel 以及定义 ViewModel DataContext 和 ButtonCommand 命令绑定的 View XAML

是否有一种“适当的”或“社区标准”的方式来组织代码?在这两种方法中,我设置它的方式是否不当?

方式一: OpenLoginPrompt ICommand 文件:

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();
        }
    }
}

方式二: 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
    }
}

主窗口视图模型

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 文件中(我目前正在做的事情)还是模型/视图模型的一部分,还是只是一个偏好问题?

4

1 回答 1

1

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

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

于 2013-10-01T14:10:50.880 回答