2009-04-30 8 views
8

次のRoutedCommandの例は機能します。RoutedCommandハンドラをView-codebehindからViewModelに移動するにはどうすればいいですか?

ただし、コマンドを実行するボタンの操作は、ビューのコードの後に​​あります。 MVVMを理解する方法は、はViewModelにあるはずです。 ManagedCustomersViewにOnSaveの定義が含まれていません。 "というエラーが表示されます。この場合、メソッドがViewModelに移動され、publicに変更されます。 RoutedCommandの2番目のパラメータをtypeof(ManageCustomersViewModel)に変更しても、同じエラーが発生します。

コマンドハンドラをView-codebehindからViewModelに移動するにはどうすればよいですか?

ManageCustomersView.xaml:

<UserControl.CommandBindings> 
    <CommandBinding Command="local:Commands.SaveCustomer" Executed="OnSave"/> 
</UserControl.CommandBindings> 
... 
<Button Style="{StaticResource formButton}" 
    Content="Save" 
    Command="local:Commands.SaveCustomer" 
    CommandParameter="{Binding Id}"/> 

ManageCustomersView.xaml.cs:

private void OnSave(object sender 
        , System.Windows.Input.ExecutedRoutedEventArgs e) 
{ 
    int customerId = ((int)e.Parameter); 
    MessageBox.Show(String.Format 
     ("You clicked the save button for customer with id {0}.", customerId)); 
} 

Commands.cs:

using System.Windows.Input; 
using TestDynamicForm123.View; 

namespace TestDynamicForm123 
{ 
    public class Commands 
    { 
     public static RoutedCommand SaveCustomer = 
      new RoutedCommand("SaveCustomer", typeof(ManageCustomersView)); 
    } 
} 

答えて

8

コマンドを参照するViewModelからプロパティを公開します。あなたは同様にあなたのモデルに実際のコマンド・ロジックを定義することができるように、それが簡単にRelayCommandを使用することを見つけるかもしれないがXAML

<Button Command="{Binding SaveCmd}" /> 

で次に

class MyViewModel 
{ 
    public RoutedCommand SaveCmd{ get{ return Commands.SaveCustomer; } } 
} 

+0

ええと、私はこれらの2ビットのコードを追加しました。そして今、私のボタンをクリックすることは何もしません。私はUserControl.CommandBindingsを取り出すか、そのまま残しても効果はありません。出力には何もありません。それ以外に何が変わる必要がありますか? –

+0

RoutedCommandを見てみましょう。ビューモデル内から新しいRoutedCommand(p => MessageBox.Show( "Saving。"))をすべて返すことができます。 –

+0

私は以前のコメント者がRelayCommandを意味すると思います。 –

関連する問題