カスタムWPFコマンドの実装

メディア

カスタムWPFコマンドを実装したかったのですが、次のコードを検索して見つけました。

public static class CustomCommands
{
    public static readonly RoutedUICommand Exit = new RoutedUICommand
    (
        "Exit",
        "Exit",
        typeof(CustomCommands),
        new InputGestureCollection()
        {
            new KeyGesture(Key.F4, ModifierKeys.Alt)
        }
    );

    //Define more commands here, just like the one above
}


私が理解できないことが2つあります。

  1. コマンドが必要static readonlyですか?使用して宣言することはできconstませんか?

  2. 正確にnew InputGestureCollection() { new KeyGesture(Key.F4, ModifierKeys.Alt) }は何ですか?デフォルトのコンストラクターを呼び出してプロパティを初期化している場合は、割り当てるプロパティがあるはずですが、割り当てるものはありません。InputGestureCollection中かっこがありますが、中かっこ内ではプロパティを初期化していません。どうやって?このタイプのステートメントは何ですか?

ドミニク

いいえ、それは良い方法ではありません。

まず、MVVMを使用したWPFの基本的な理解を得る必要があります。UIにバインドするクラスがあります。そのクラスは.xaml.csではありません

ビューから完全に独立しています。クラスのインスタンスをウィンドウのDataContextに配置する必要があります。これは、.xaml.csで次のようにsthを呼び出すことで実行できます。

this.DataContext = new MyViewModel();

これで、クラスMyViewModelにはタイプICommandのプロパティが必要になります。ベストプラクティスは、ICommandを実装するクラスを作成することです。通常、これをDelegateCommandまたはRelayCommandと呼びます。例:

public class DelegateCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;

    public event EventHandler CanExecuteChanged;

    public DelegateCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public DelegateCommand(Action<object> execute,
                   Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        if (_canExecute == null)
        {
            return true;
        }

        return _canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    public void RaiseCanExecuteChanged()
    {
        if (CanExecuteChanged != null)
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
    }
}

次に、ViewModelで、そのクラスのインスタンスを含むプロパティを作成します。そのように:

public class MyViewModel{

   public DelegateCommand AddFolderCommand { get; set; }
   public MyViewModel(ExplorerViewModel explorer)
   {           
       AddFolderCommand = new DelegateCommand(ExecuteAddFolderCommand, (x) => true);
   }

   public void ExecuteAddFolderCommand(object param)
   {          
       MessageBox.Show("this will be executed on button click later");
   }
}

ビューで、ボタンのコマンドをそのプロパティにバインドできるようになりました。

<Button Content="MyTestButton" Command="{Binding AddFolderCommand}" />

ルーティングされたコマンドは、デフォルトでフレームワークにすでに存在するものです(コピー、貼り付けなど)。MVVMの初心者の場合は、「通常の」コマンドの基本を理解する前に、ルーティングされたコマンドを作成することを考えるべきではありません。

最初の質問に答えるには:コマンドを静的または定数、あるいはその両方にする必要はまったくありません。(クラスMyViewModelを参照)

2番目の質問:{-bracketsに入れたデフォルト値でリストを初期化できます例:

var Foo = new List<string>(){ "Asdf", "Asdf2"};

プロパティを初期化するオブジェクトがありません。初期化するリストがありAdd(){-bracketsに入力したパラメーターを使用してが呼び出されます。

それはあなたの場合にも基本的に起こることです。いくつかの値で初期化するコレクションがあります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

VSIXでのカスタムコマンドの非同期実装

分類Dev

カスタムコマンドラインと実行を実装する方法

分類Dev

TotalCommanderのカスタムコマンド

分類Dev

ZSHのカスタムコマンド

分類Dev

カスタムバインドの問題の実装

分類Dev

lldb:ユーザー入力を受け取るカスタムコマンドを実装する

分類Dev

リストADTのパターンマッチングカスタム実装

分類Dev

カスタムタイムアウト実装のコルーチン

分類Dev

SymfonyでカスタムRedisコマンドを実行する

分類Dev

カスタム間隔でコマンドを実行する

分類Dev

Geanyでカスタムコマンドを実行する

分類Dev

Vimでカスタムコマンドを実行する

分類Dev

カスタム CLI コマンドで ShellScript を実行する

分類Dev

マテリアルUIカスタムテーマの実装

分類Dev

マグノリア6.0カスタムアクションの実装

分類Dev

Redisレタス:カスタムコマンドの送信

分類Dev

Rustオプション、カスタムの「expect」メソッドの実装

分類Dev

handle()の後にカスタム職人コマンドでコードを実行する

分類Dev

jQuery UIThemeRollerカスタムテーマ実装の問題の使用

分類Dev

Windowsカスタムgitコマンド

分類Dev

カスタムexecCommandコマンド

分類Dev

コマンド-vカスタム出力

分類Dev

VisualStudioVSPackageカスタムコマンド

分類Dev

VisualStudioでカスタムファイル固有のコマンド/タスクを実行する方法は?

分類Dev

`timev0.1.25`のカスタムビルドコマンドの実行に失敗しました

分類Dev

カスタムドラッグドロップの実装

分類Dev

カスタムビジターパターンの実装

分類Dev

djangoカスタム管理コマンドのテスト

分類Dev

Facebookカスタムボタンの実装の問題

Related 関連記事

  1. 1

    VSIXでのカスタムコマンドの非同期実装

  2. 2

    カスタムコマンドラインと実行を実装する方法

  3. 3

    TotalCommanderのカスタムコマンド

  4. 4

    ZSHのカスタムコマンド

  5. 5

    カスタムバインドの問題の実装

  6. 6

    lldb:ユーザー入力を受け取るカスタムコマンドを実装する

  7. 7

    リストADTのパターンマッチングカスタム実装

  8. 8

    カスタムタイムアウト実装のコルーチン

  9. 9

    SymfonyでカスタムRedisコマンドを実行する

  10. 10

    カスタム間隔でコマンドを実行する

  11. 11

    Geanyでカスタムコマンドを実行する

  12. 12

    Vimでカスタムコマンドを実行する

  13. 13

    カスタム CLI コマンドで ShellScript を実行する

  14. 14

    マテリアルUIカスタムテーマの実装

  15. 15

    マグノリア6.0カスタムアクションの実装

  16. 16

    Redisレタス:カスタムコマンドの送信

  17. 17

    Rustオプション、カスタムの「expect」メソッドの実装

  18. 18

    handle()の後にカスタム職人コマンドでコードを実行する

  19. 19

    jQuery UIThemeRollerカスタムテーマ実装の問題の使用

  20. 20

    Windowsカスタムgitコマンド

  21. 21

    カスタムexecCommandコマンド

  22. 22

    コマンド-vカスタム出力

  23. 23

    VisualStudioVSPackageカスタムコマンド

  24. 24

    VisualStudioでカスタムファイル固有のコマンド/タスクを実行する方法は?

  25. 25

    `timev0.1.25`のカスタムビルドコマンドの実行に失敗しました

  26. 26

    カスタムドラッグドロップの実装

  27. 27

    カスタムビジターパターンの実装

  28. 28

    djangoカスタム管理コマンドのテスト

  29. 29

    Facebookカスタムボタンの実装の問題

ホットタグ

アーカイブ