2017-11-01 10 views
-2

ViewModel에 맞게 다음 이벤트 처리기를 리팩터링하는 방법은 무엇입니까? VM이로 선언WPF 응용 프로그램에서 MVVM 패턴 구현 메서드

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; 
} 

은 다음과 같습니다

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(); 
      } 
     } 
    } 
} 

내가 명령을 사용하여 시도했다, 그러나 실제로 MVVM 패턴을 다음 외에 어떤 혜택을 제공 할 것없는,이 버전은 실제로에만 추가 xaml에서 여분의 코드를 사용하여 EventArgs을 CommandParameter로 전달할 수 있습니다.

+0

@MickyD 그것이 소리가 나는데 미안하다. 나는이 코드를 리펙토링하는 방법을 찾고있다. 나는 문제를 해결하려고 노력한 것을 사람들에게 알리기로 결정했다. – Deadzone

+0

기껏해야 귀하의 질문이 너무 광범위합니다. 그러나 일반적으로'ICommand'는 이런 종류의 일에 대해'Button.Command' 속성에 묶여 있습니다. 'Click'대신에 'MouseDown' 이벤트를 처리하는 것조차 조금 이상합니다. 당신은 어떻게 당신이'ICommand'를 열등한 것으로 _ 객 체적으로 찾았는지, 그리고 당신이 제공하지 않는 것이 무엇인지를 설명합니다. –

+0

@PeterDuniho 버튼을 사용하지 않아서 '클릭'을 캡처하지 않습니다. 사용하고있는 이미지입니다. ICommand 버전이 열등한 이유는 xaml에 쓸 필요가있는 모든 추가 코드 때문입니다. args가 매개 변수로 전달 된 이벤트를 가져올 수 있습니다. 게다가 그것은 괜찮아 보인다. – 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