2017-11-01 17 views
-2

ViewModelに収まるように、次のイベントハンドラをどのようにリファクタリングしますか?私はコマンドを使用して試してみましたが、彼らは実際にMVVMパターンを次のように加えて任意の利点を提供しているようだしないでください、このバージョンは実際にのみ追加WPVMアプリケーションでMVVMパターンを実装する方法

public class VideoPlayerViewModel : ViewModelBase 
{ 
    private TimeSpan _movieElapsedTime = default(TimeSpan); 
    public TimeSpan MovieElapsedTime 
    { 
     get => _movieElapsedTime; 
     set 
     { 
      if (value != _movieElapsedTime) 
      { 
       _movieElapsedTime = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    private TimeSpan _movieLeftTime = default(TimeSpan); 
    public TimeSpan MovieLeftTime 
    { 
     get => _movieLeftTime; 
     set 
     { 
      if (value != _movieLeftTime) 
      { 
       _movieLeftTime = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
} 

を次のようにVMが宣言されている

private void imgSkipBack_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ChangedButton == MouseButton.Left) 
    { 
     SetNewPlayerPosition(ViewModel.MovieElapsedTime.Subtract(Settings.SkipSeconds).TotalSeconds >= 0 
      ? ViewModel.MovieElapsedTime.Subtract(Settings.SkipSeconds) 
      : new TimeSpan(0)); 
    } 
} 

private void SetNewPlayerPosition(TimeSpan newPosition) 
{ 
    Player.Position = newPosition; 
    AlignTimersWithSource(Player.Position); 
} 

private void AlignTimersWithSource(TimeSpan currentPosition) 
{ 
    ViewModel.MovieLeftTime = Player.NaturalDuration.TimeSpan - currentPosition; 
    ViewModel.MovieElapsedTime = currentPosition; 
} 

xamlの余分なコードは、EventArgsをCommandParameterとして渡すことができます。

+0

@MickyDそれが聞こえるようになったらごめんなさい、このコードをリファクタリングする方法を探しています。私は問題を解決しようとしたことを人々に知らせることにしました。 – Deadzone

+0

最高であなたの質問は広すぎます。しかし、典型的には、 'ICommand'を' Button.Command'プロパティにバインドして使用します。 'Click'の代わりに' MouseDown'イベントを処理することさえ少し奇妙です。どのような_客観的な方法であなたが 'ICommand'を見つけたのか、あなたが提供していないことが何を求めているのかを説明してください。 –

+0

@PeterDuniho私はボタンを使用していないので、私は「クリック」をキャプチャしていない、私は使用している画像、ICommandのバージョン下位を見つける理由は、xaml、パラメータとして渡されたイベント引数を取得することができます。それ以外には、それは良いようです。 – Deadzone

答えて

1

ViewModelに収まるように、次のイベントハンドラをどのようにリファクタリングしますか?

要素のMouseLeftButtonDownイベントが発生したときは、コマンドを呼び出すために対話トリガを使用することができます。

<Image ...> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="MouseLeftButtonDown" > 
      <i:InvokeCommandAction Command="{Binding YourCommand}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Image> 

あなたはSystem.Windows.Interactivityを参照する必要があります。詳細については、https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/のブログ記事を参照してください。何が起こるか、すなわち、利益はあなたのアプリケーションロジックを移動することである...

を、私はコマンドを使用して試してみましたが、彼らは実際にMVVMパターンを次のように加えて任意の利点を提供しているようだしないでください

要素がクリックされると、それが属するビューモデルに移動します。

+0

あなたの答えをありがとう、コマンドがどのように見えるかの例を提供してくださいか? – Deadzone

+0

ブログの記事を読んでください。コマンドのExecuteメソッドでSetNewPlayerPositionメソッドを呼び出すだけです。 – mm8

+0

'MediaElement Player 'をViewModelに移動するにはどうしたらいいですか?このコントロールの多くのプロパティにアクセスしているので、私はむしろVMでそれを持っています。 – Deadzone

関連する問題