2011-03-10 9 views
0

MVVM Light 프레임 워크를 사용하여 SL4 응용 프로그램을 작성하고 있습니다. 내 간단한 응용 프로그램은 주로 여러 개의 UserControls로 나뉘어져있는 단일 기본보기 (shellView)로 구성됩니다. 그것들은 단지 UI의 편리한 분리이므로 그들 자신의 ViewModel이 없습니다.Galasoft RelayCommand가 실행되지 않음

ShellView에는 여러 KeypadButtons (사용자 정의 usercontrols)가 포함 된 키패드 (사용자 정의 usercontrol)가 있습니다.

DataContext가 올바르게 설정되어 있고 계층 구조의 모든 usercontrols에서 사용되는 것으로 확인되었습니다. (ShellView의 Datacontext는 ShellViewModel이고 Keypad의 DataContext는 ShellViewModel입니다.

ShellViewModel에는 "ProcessKey"라는 ICommand (RelayCommand)가 있습니다. KeypadButton은 기본적으로 버튼을 포함하는 그리드입니다

<controls:KeypadButton x:Name="testBtn" Text="Hello"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding PressStandardKeyCommand}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
</controls:KeypadButton> 

: 키패드 제어에서

는, 내가 좋아하는 뭔가가있다. MouseLeftButtonUp 이벤트가 잡히고 사용자 지정 "Click"이벤트가 발생합니다. 내가 뭐하는 거지 내가 당신에게 쉽게 설명하는 몇 가지 코드를 보여 드리죠 : 나는 innerButton_Click의 몸에 중단 점을 설정 한 경우

이제
public partial class KeypadButton : UserControl 
{ 
    public delegate void KeypadButtonClickHandler(object sender, RoutedEventArgs e); 
    public event KeypadButtonClickHandler Click; 

public KeypadButton() 
{ 
     // Required to initialize variables 
    InitializeComponent(); 
} 

    private void innerButton_Click(object sender, MouseButtonEventArgs e) 
    { 
     if (Click != null) 
      Click(sender, new KeypadButtonEventArgs()); 
    } 
} 

public class KeypadButtonEventArgs : RoutedEventArgs 
{ 
    public string test { get; set; } 
} 

, 나는 클릭이 제대로 잡혀가 RelayCommand에 포인트를 포함하고 있습니다 볼 수 있습니다. 그러나 아무 것도 발생하지 않습니다 : "클릭 (발신자, 새 KeypadButtonEventArgs());" 실행되지만 아무것도 더.

왜 이렇게 행동합니까? RelayCommand에 정의 된 대상 함수를 실행해야합니까? 어쩌면 범위와 관련된 문제일까요?

미리 감사드립니다. 건배, Gianluca.

답변

0

라우팅 이벤트는이 (see documentation) 같이 정의한다 :

다른 의견에서 언급 한 바와 같이
public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
    "Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple)); 

// Provide CLR accessors for the event 
public event RoutedEventHandler Tap 
{ 
     add { AddHandler(TapEvent, value); } 
     remove { RemoveHandler(TapEvent, value); } 
} 
+0

내 게시물에서 말했듯이 SL4를 사용하고 있습니다. 내가 아는 한 여기에는 EventManager가 없습니다. 내가 잘못? –

+0

사용자 지정 이벤트 처리기를 RoutedEventHandler로 선언하려고 시도했지만 여전히 동일한 문제가 있습니다. Click 이벤트에 EventTriggerBase 인스턴스가 있지만 실제로 호출해야하는 경우 아무 것도 발생하지 않습니다. 어떤 도움이라도 정말 감사 할 것입니다! 모두 감사합니다! –

+0

죄송합니다. SL을 사용하고 있다는 것을 인식하지 못했습니다 (다음 번에 더 잘 읽을 필요가 있음). 이 기사 (http://www.silverlightshow.net/items/Routed-Events-in-Silverlight.aspx)에 따르면 맞춤 라우트 된 이벤트는 SL에서 지원되지 않습니다. –

1

는, 이것은 아마도 Click 이벤트가 RoutedEvent을되지 않는 관계가있다.

빠른 해킹으로 UserControl에서 Click 이벤트 대신 MouseLeftButtonDown을 사용할 수 있습니다. 당신이 고려할 수

<!-- Kinda Hacky Click Interception --> 
<controls:KeypadButton x:Name="testBtn" Text="Hello"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="MouseLeftButtonDown"> 
       <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding PressStandardKeyCommand}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
</controls:KeypadButton> 

또 다른 옵션은 Button 대신 UserControl에서 상속됩니다. 실버 라이트 쇼에는 아마도 이와 관련있는 article about inheriting from a TextBox이 있습니다.

+0

+1, 특히 필요한 것이 아니라면 Control/UserControl에서 필요한 것을 상속하는 것이 좋습니다. –

+0

@Alex : 고맙습니다. 그러나 저는 여기서 우리가 요점을 놓치고 있다고 생각합니다. 또한, MouseLeftButtonUp (동일한 있어야합니다) 이미 시도하고 작동하지 않았다. KeypadButton의 이벤트가 생성되고 코드에서 프로그래밍 방식으로 구독 할 수 있습니다. 문제는 EventTrigger가 생성 된 이벤트를 포착 할 수없는 것 같습니다. 여기 XAML 및 EventToCommand에서 작업하기 위해 실무적인 사용자 정의 컨트롤의 사용자 지정 이벤트를 특정 방식으로 구현해야 하는지를 이해하는 질문을 게시했습니다. –