2012-06-16 13 views
5

OK、私はコマンドを使用しないでください。なぜなら、彼らはいつも私を混乱させるので、私は新しいプロジェクトを開始しています。ビュー。基本的に私が今しようとしているのは、私のビューモデルでいくつかのことをするコマンドを起動するボタンを押し上げることです。私は近くにいると思うけど、そこにはあまり行き届かない。ここに私が今いるものがあります。viewmodelからメソッドを呼び出すコマンド

<Window.Resources> 
    <RoutedUICommand x:Key="GetMusic" /> 
</Window.Resources> 
<Window.DataContext> 
    <core:ViewMain /> 
</Window.DataContext> 
<Window.CommandBindings> 
    <CommandBinding Command="{StaticResource GetMusic}" Executed="GetMusicExecuted"/> 
</Window.CommandBindings> 

とビューモデルが今

public class ViewMain 
{ 
    public MusicCollection Music { get; set; } 

    private void GetMusicExecuted(object sender, ExecutedRoutedEventArgs e) 
    { 
     //Logic 
    } 
} 

ほとんど何もありませんが今、私が何をしようとしている私はちょうど私の実行メソッドを呼び出すために私のコマンドバインディングで設定し、このコマンドまでのワイヤであります私のビューモデルでは、ビュー自体の中でそのメソッドを見つけることを試みます。代わりに私のビューモデルのメソッドにそれを向けることができるか、同じことを達成するためにこれを設定するより良い方法はありますか?最初は単純なままにしておきたいので、私はあまりにも早く自分の心を吹き飛ばすことはありません。

+0

あなたはXAMLを介して、またはいずれかの結合セットアップを必要としますコードの後ろ – uowzd01

+0

Prismのような標準のMVVMフレームワークでDelegateCommandsを使用してみましたか?あなたのコマンドはVMに常駐しているのでCommandBindingsを定義しなくてもバインドすることができます。 –

答えて

11

私は自分のコマンドクラスを使い、ICommandを実装する傾向があります。次に、私はビューモデルのコマンドプロパティにButton Commandプロパティをバインドします。ボタンをクリックすると、CommandプロパティにバインドされているものがあればExecuteメソッドが実行されます。

これは2分間の醜いバージョンですが、Commandクラスを作成して、ビューモデルで好きな方法を指すデリゲートを割り当てる方法を示しています。

のViewModel:

public class MyViewModel 
{ 
    public MyCommand ActionCommand 
    { 
     get; 
     set; 
    } 

    public MyViewModel() 
    { 
     ActionCommand = new MyCommand(); 
     ActionCommand.CanExecuteFunc = obj => true; 
     ActionCommand.ExecuteFunc = MyActionFunc; 
    } 

    public void MyActionFunc(object parameter) 
    { 
     // Do stuff here 
    } 

} 

public class MyCommand : ICommand 
{ 
    public Predicate<object> CanExecuteFunc 
    { 
     get; 
     set; 
    } 

    public Action<object> ExecuteFunc 
    { 
     get; 
     set; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return CanExecuteFunc(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 

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

ビュー(のDataContextは、ビューモデルのインスタンスに設定されていると仮定した場合)thuslyそれに結合する:

<Window x:Class="exp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Command="{Binding Path=ActionCommand}">Action</Button> 
    </Grid> 
</Window> 
+0

この場合は、コマンドごとに異なる関数を送信できるので、すべてのコマンドのベースとしてMyCommandを使用していますか? –

+1

この場合、はい。そして、あなたがしたいのは、あなたのビューモデル上で既存のメソッドを呼び出すだけであれば、たくさんの異なるコマンドクラスを作成する必要はありません。あなたが望むなら、あなたは異なるコマンドを作成することができます。 – Japple

関連する問題