0

免責事項:私はまだ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 ファイル (私が現在行っていること) またはモデル/ビューモデルの一部にする必要がありますか、それとも単に好みの問題ですか?

4

1 に答える 1

1

2 番目の ICommand 実装 (RelayCommand) を使用する必要があります。これは、あらゆる目的に使用できる汎用コマンドであるためです。つまり、このコマンド インスタンスを使用して他のボタン/メニュー コマンドにバインドできます。最初のものはかなり厳格で、1 つの目的しか果たしません。

理想的には、すべての新しいクラスは新しいファイルにある必要があります。ViewModelレイヤーにコマンドフォルダーを個人的に作成し、そこにコマンドを配置します。

于 2013-10-01T14:10:50.880 に答える