2016-12-23 20 views
2

MVVMとPRISMを学習し、TextBoxのDropイベントとDragEnterイベントを処理しようとしています。MVVMとPrism - ViewModelでTextBox_DragEnterとTextBox_Dropイベントを処理する方法

私はこれが正常に動作しているEventArgsを取ることはありません他のイベントのためにこれをやって何の問題を持っていない

public ButtonsViewModel() 
    { 
     //If statement is required for viewing the MainWindow in design mode otherwise errors are thrown 
     //as the ButtonsViewModel has parameters which only resolve at runtime. I.E. events 
     if (!(bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue) 
     { 
      svc = ServiceLocator.Current; 
      events = svc.GetInstance<IEventAggregator>(); 
      events.GetEvent<InputValidStatus>().Subscribe(SetInputStatus); 
      StartCommand = new DelegateCommand(ExecuteStart, CanExecute).ObservesProperty(() => InputStatus); 
      ExitCommand = new DelegateCommand(ExecuteExit); 
     } 
    } 

    private bool CanExecute() 
    { 
     return InputStatus; 
    } 

    private void ExecuteStart() 
    { 
     InputStatus = true; 
     ERA Process = new ERA(); 
     Proces.Run(); 
    } 

をクリックボタンに成功し、これを行うために管理しています。したがって、EventArgsと対話する必要はないため、Dropメソッドを実装すると問題ありません。

しかしTextbox_DragEnterイベントでそれは私の最初の考えはのICommandを作成し、TextBox_DragEnterイベントにバインドすることだったとのViewModel内のTextBoxのDragDropEffects

private void TextBox_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effects = DragDropEffects.Copy; 
    } 

を設定DragDropEffectsプロパティこの更新プログラムを持っています。しかし、テキストボックスにエフェクトをバインドする方法はわかりません。

私はこの間違いを考えているかもしれません。これを行う適切な方法は何ですか?

私は背後にあるコードで簡単にこれらのイベントを設定することができます知っているが、私はこれを行うと、純粋に、これは理にかなってMVVMパターンに

希望を使用してそれを維持したくありません。

+0

私はイベントにプロパティを追加してから、これらのプロパティのイベントのパラメータをViewModelに渡したと思います。 – ganchito55

+0

ビューからどのようにしましたか? – gheff

+0

はい、私はより良い解決策を見つけませんでした – ganchito55

答えて

2

ありますが、これはプリズム(非MVVMLightソリューションで動作します

<i:Interaction.Triggers> 
     <i:EventTrigger EventName="RowActivated"> 
      <commands:EventToCommand Command="{Binding X}" PassEventArgsToCommand="True"/> 
     </i:EventTrigger> 
</i:Interaction.Triggers> 

あなたのコントロールの内側にこのコードを入れてください)。必要

名前空間:

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

XAML:

<TextBox Name="TextBox" Text="{Binding MVFieldToBindTo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="DragEnter"> 
      <i:InvokeCommandAction 
       Command="{Binding BoundCommand}" 
       CommandParameter="{Binding Text, ElementName=TextBox}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</TextBox> 

BoundCommandは、ビューモデルでDelegateCommandだろう。それはすでに何が良いか分かっているようです。これはDragEnterを使って書かれていますが、実際にはLostFocusイベントにのみ使用していますので、これでちょっと試してみてください。それは正しい方向に進むようになるはずです。

+0

コマンドパラメータには、渡されたeventargsがありますか? – gheff

+0

それは上に書かれている方法ではありません。ここで見て:http://stackoverflow.com/questions/13565484/how-can-i-pass-the-event-argument-to-a-command-using-triggers –

+0

私は説明を使用して、ショーンチェイスR. Richardsが私の問題を解決するために提供したこの記事http://stackoverflow.com/questions/13565484/how-can-i-pass-the-event-argument-to-a-command-using-triggers – gheff

0

相互作用イベントトリガーを使用して、ビューモデル内のコマンドを起動できます。たとえば、以下の例では、コマンドXをRowActivatedイベントまで配線しています。これは、MVVMLight EventToCommandヘルパーを使用します。あなたが必要とする名前空間がケビンが提案されているものと同様、これに別の相互作用トリガー溶液、

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:commands="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras" 
関連する問題