ビューのWPFイベントをViewModelにバインドする最良の方法は何ですか?
ビューにドロップイベントがありますが、それをViewModelのデューバインディングに置き換えます。
いくつかの解決策が見つかりましたが、どれも私が期待したことをしませんでした。
コードを表示:
<TextBox
AllowDrop="True"
PreviewDrop="email_Drop" />
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をインストールすることだけです。
そのための1つの方法は、そのイベントをコマンドに変換し、それをプレゼンターコマンドにバインドすることです。つまり、イベントの動作を定義することです。
これを参照してください ViewModelへのWPFイベントバインディング(非コマンドクラスの場合)
<Button MouseDoubleClick="{eb:EventBinding Command=DoSomethingCommand}">
</Button>
コマンド
{eb:EventBinding}(コマンドを見つけるための単純な命名パターン)
{eb:EventBinding Command = CommandName}
CommandParameter
$ e(EventAgrs)
$ thisまたは$ this.Property
ストリング
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);
}
}