免責事項:私はまだMVVMとWPFを学んでいるので、これは私が知っているすべてのICommandとRelayCommandの質問かもしれません. 私はMVVMフレームワークなどを使用しておらず、VS2010のみを使用しています。
現在、子ウィンドウを開くログインボタンを備えた MainWindow があります。次のいずれかを使用して、これを実現できました。
- コマンド ファイルにメニューを開くためのすべてのコードを含む標準の ICommand と、StaticResource Binding および Key を使用して XAML を表示する (ViewModel にコードはありません)
- 標準の RelayCommand を定義する RelayCommand コマンド ファイル、子を開く RelayCommand "ButtonCommand" を定義する ViewModel、および ViewModel DataContext と ButtonCommand コマンド バインディングを定義する View XAML
コードを整理するための「適切な」または「コミュニティ標準」の方法はありますか? どちらのアプローチでも、私が設定している方法は不適切ですか?
方法 1: 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();
}
}
}
方法 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 ファイル (私が現在行っていること) またはモデル/ビューモデルの一部にする必要がありますか、それとも単に好みの問題ですか?