2012-06-14 4 views
2

프리즘을 사용하여 이벤트 수집기를 구현하는 방법에 대한 좋은 예제를 찾고 있습니다. 필자는 Prism을 사용한 적이 없으며 MVVM 자체에 대해서도 처음 소개되었습니다.MVVM 이벤트보기 Viewmodel 명령 바인딩

저는 WPF 캔버스를 뷰로 사용하며 ViewModel의 캔버스에서 MouseUp 이벤트를 처리하려고합니다. 이제 우리 조직에있는 권한으로 필자는 프리즘을 사용하기를 원합니다. 프리즘은 이벤트 수집기를 사용하는 것이 좋습니다. 따라서 필자는 시작하기 위해 샘플이 필요합니다.

답변

4

MVVMLight 또는 System.Windows.Interactivity (Blend SDK)의 EventToCommand 동작 만 있으면됩니다. 나는 그것을 몇 가지 유용한 스페셜 : 내가 대부분의 ViewModel 통신에 분리 된 뷰 모델에 사용되는 프리즘에서

<Canvas> 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="MouseUp" > 
     <i:InvokeCommandAction Command="{Binding YourMouseUpViewModelCommand}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
</Canvas> 

EventAggregator을 가지고 있기 때문에 당신이 MVVMLight 버전을 위해 추천 할 것입니다.

1

PRISM의 EventAggregator가 이벤트 -> 명령 바인딩에 허용되지 않습니다.

이 경우 또 다른 옵션은 "동작"을 사용하는 것입니다. 보기 좋은 행동 Behaviors가 있습니다 : http://wpftutorial.net/Behaviors.html. 튜토리얼의 블렌드 부분은 무시할 수 있습니다. 중요한 부분은 적어도 Blend 3 SDK가 설치되어 있어야한다는 것입니다. 여기에 내가 이런 짓을하는 방법은 다음과 같습니다

public class ButtonDoubleClickCommandBehavior : Behavior<Button> 
{ 
    public ICommand DoubleClickCommand 
    { 
     get { return (ICommand)GetValue(DoubleClickCommandProperty); } 
     set { SetValue(DoubleClickCommandProperty, value); } 
    } 

    public static readonly DependencyProperty DoubleClickCommandProperty = 
     DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(ButtonDoubleClickCommandBehavior)); 

    protected override void OnAttached() 
    { 
     this.AssociatedObject.MouseDoubleClick += AssociatedObject_MouseDoubleClick; 
    } 

    protected override void OnDetaching() 
    { 
     if (this.AssociatedObject != null) 
     { 
      this.AssociatedObject.MouseDoubleClick -= AssociatedObject_MouseDoubleClick; 
     } 
    } 

    void AssociatedObject_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     if (DoubleClickCommand != null && DoubleClickCommand.CanExecute(null)) 
     { 
      DoubleClickCommand.Execute(null); 
     } 
    } 
} 
당신은 당신이 매개 변수를 사용하여 명령을 실행할 수 있도록 명령 매개 변수를 바인딩하는 행동에 다른 종속성 속성을 추가 할 수

; 내 예제에서는 null을 사용했습니다.

그리고 내 XAML :

<Button Content="{Binding Path=Description}" VerticalAlignment="Center" HorizontalAlignment="Stretch" Template="{StaticResource TextBlockButtonTemplate}" Style="{StaticResource ZynCommandButton}" Tag="DescriptionButton"> 
    <e:Interaction.Behaviors> 
     <ZViewModels:ButtonDoubleClickCommandBehavior DoubleClickCommand="{Binding Path=ItemDescriptionCommand}"/> 
    </e:Interaction.Behaviors> 
</Button> 
0

행동을 사용하는보다 일반적인 방법은 AttachedCommandBehavior V2 aka ACB에서 제안하고 심지어 여러 이벤트에-명령 바인딩을 지원하며, 여기에

사용의 매우 기본적인 예입니다 :

<Border local:CommandBehavior.Event="MouseDown" 
     local:CommandBehavior.Command="{Binding DoSomething}" 
     local:CommandBehavior.CommandParameter="From the DarkSalmon Border" 
/>