1

Silverlight / WPFでMVVMパターンを使用して、イベントハンドラーをどのように接続しますか?XAML Clickプロパティをビューモデルのデリゲートにバインドしようとしていますが、機能させることができません。

言い換えれば、私はこれを置き換えたいと思います:

<Button Content="Test Click" Click="Button_Click" />

Button_Clickは次のとおりです。

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    // ...
}

これとともに:

<Button Content="Test Click" Click="{Binding ViewModel.HandleClick}" />

ここで、HandleClickはハンドラーです。これを試みると、ランタイム例外がスローされます。

タイプ「System.Windows.Data.Binding」のオブジェクトをタイプ「System.Windows.RoutedEventHandler」に変換することはできません。

4

2 に答える 2

5

これを行うMVVMの方法は、コマンドとICommandインターフェイスを使用することです。Buttonコントロールには、Commandタイプのオブジェクトを受け取るという名前のプロパティがありますICommand

一般的に使用されるの実装ICommandPrismのDelegateCommandです。これを使用するには、ビューモデルでこれを行うことができます。

public class ViewModel
{
    public ICommand DoSomethingCommand { get; private set; }

    public ViewModel()
    {
        DoSomethingCommand = new DelegateCommand(HandleDoSomethingCommand);
    }

    private void HandleDoSomethingCommand()
    {
        // Do stuff
    }
}

次にXAMLで:

<Button Content="Test Click" Command={Binding DoSomethingCommand} />

また、ビューモデルがビューのDataContextとして設定されていることを確認してください。これを行う1つの方法は、ビューのコードビハインドです。

this.DataContext = new ViewModel();

この記事は、MVVMについて詳しく知りたい場合に開始するのに適した場所です。

于 2012-06-16T20:12:14.113 に答える
0

答えは、PrismフレームワークでMicrosoftが提供する拡張機能を使用することです。DLL System.Windows.Interactivity.dllおよびMicrosoft.Expression.Interactions.dllを使用すると、ビューモデルのハンドラーメソッドにイベントをバインドできます。

<Button Content="Test Click"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"      
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <ei:CallMethodAction TargetObject="{Binding ViewModel}" MethodName="HandleClick" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>
于 2012-06-16T19:32:58.417 に答える