web-dev-qa-db-ja.com

ViewからViewModelへのWPFイベントバインディング?

ビューのWPFイベントをViewModelにバインドする最良の方法は何ですか?

ビューにドロップイベントがありますが、それをViewModelのデューバインディングに置き換えます。

いくつかの解決策が見つかりましたが、どれも私が期待したことをしませんでした。

コードを表示:

    <TextBox 
    AllowDrop="True" 
    PreviewDrop="email_Drop" />
24
jefsmi

MVVMおよびXAMLでイベントを処理する1つの方法は、ブレンド対話機能を使用することです。この名前空間には、InvokeCommandActionクラスとCallMethodActionクラスが含まれています。

InvokeCommandActionを使用すると、任意のイベントをビューモデルコマンドにバインドでき、CallMethodActionを使用すると、任意のイベントをビューモデルメソッドにバインドできます。

たとえば、ButtonのDoubleClickイベントをview-modelコマンドにバインドする場合は、次のようにします。

<Button>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding Path=DoSomethingCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

そして、この名前空間を宣言します:

xmlns:i="http://schemas.Microsoft.com/expression/2010/interactivity"

プロジェクトでそれを参照する必要があるのは、Expression BlendまたはExpression Blend SDKをインストールすることだけです。

55
Ucodia

そのための1つの方法は、そのイベントをコマンドに変換し、それをプレゼンターコマンドにバインドすることです。つまり、イベントの動作を定義することです。

これを参照してください ViewModelへのWPFイベントバインディング(非コマンドクラスの場合)

5
Bhupendra Joshi
<Button MouseDoubleClick="{eb:EventBinding Command=DoSomethingCommand}">

</Button>

コマンド

{eb:EventBinding}(コマンドを見つけるための単純な命名パターン)

{eb:EventBinding Command = CommandName}

CommandParameter

$ e(EventAgrs)

$ thisまたは$ this.Property

ストリング

https://github.com/JonghoL/EventBindingMarkup

1
jongho

Bindingcontextからviewmodelを取得し、そこからviewmodelメソッドをアクティブ化します

    public partial class ParentView : ContentPage
    {
            public ParentView()
            {            
                InitializeComponent();
            }

            private void LanguagePicker_SelectedIndexChanged(object sender, System.EventArgs e)
            {
                var parentViewModel = (ParentViewModel)this.BindingContext;
                parentViewModel.SelectedLanguageChanged(sender,e);
            }
    }
0