2

ビューモデルで、ボタンからルーティングされたコマンドを処理したいと考えています。次のように、Usercontrol の分離コードで動作させることができます。

Dim NewCommandBinding As CommandBinding = New CommandBinding(GlobalCommands.ResultsFilterChangedCommand,
                                                                     AddressOf ExecuteResultsFilterChanged,
                                                                     AddressOf CanExecuteResultsFilterChanged)
        CommandBindings.Add(NewCommandBinding)

そして、XAML でそれにバインドします。

<ToggleButton x:Name="FilterTgl" Content="Archives" Margin="10,4" Padding="10,2"
                            Command="cmds:GlobalCommands.ResultsFilterChangedCommand" />

しかし、コードをビューモデルに移動すると、「コマンドバインディングが宣言されていません」というメッセージが表示されます。おそらく、私の UserControl は UI であり、ViewModel はそうではないためです。

ビューモデルでコマンドを直接処理しようとしてはいけませんか? アドバイスをありがとう。

4

3 に答える 3

2

MVVM については、を調査することを強くRelayCommandお勧めします。これは、単純な Lambda 式を使用してコマンドを記述できるため、MVVM に最適です。ActionCommandに非常によく似た私のカスタムを使用した簡単な例を次に示しRelayCommandます。

public override ICommand DeleteCommand
{
    get { return new ActionCommand(action => Delete(action), canExecute => CanDelete()); }
}

の詳細な説明については、 MSDNの Model-View-ViewModel デザイン パターンを使用RelayCommandしたWPF アプリの記事を参照してください。より明確な実装については、MSDN 開発者フォーラムの実装 RelayCommand投稿を参照してください。

于 2013-11-12T14:38:36.070 に答える
2

プロパティを明示的に設定するのではなく、コマンドにデータバインドする必要があります。ViewModel がビューのデータ コンテキストであると仮定すると、構文は次のようになります (実行は試していません)。

<ToggleButton Command="{Binding NameOfTheCommandPropertyOnYourViewModel}"/>

ビューモデルはコマンドを ICommand として公開する必要があり、それは (単なるフィールドではなく) プロパティである必要があります。

私も Sheridan に同意します。リレー コマンドを検討する必要があります。

于 2013-11-12T14:45:02.800 に答える
2

はい、ビューモデルは、xaml がバインドするコマンド プロパティを宣言することにより、ボタンの押下を処理する必要があります。簡単な例については、このリンクを参照してください: MWWV コマンドの例

于 2013-11-12T14:35:27.443 に答える