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