2014-10-05 3 views
0

Window Closed 이벤트를 내 ViewModel로 리디렉션하려고하지만 AttachedProperties 사용 경험이 부족합니다.WPF AttachedProperty를 사용하여 창을 닫고 ViewModel에서 동작합니다.

는 창을 닫고 RelayCommand을 트리거 할 수 있도록 어떻게 동작을 구현할 수 AttachedProperty

public class WindowClosedBehavior 
{ 
    public static readonly DependencyProperty ClosedProperty = DependencyProperty.RegisterAttached(
     "Closed", 
     typeof (ICommand), 
     typeof (WindowClosedBehavior), 
     new UIPropertyMetadata(ClosedChanged)); 

    private static void ClosedChanged(
     DependencyObject target, 
     DependencyPropertyChangedEventArgs e) 
    { 
     var window = target as Window; 

     if (window != null) 
     { 
      // ?? 
     } 
    } 

    public static void SetClosed(Window target, ICommand value) 
    { 
     target.SetValue(ClosedProperty, value); 
    } 
} 

을 보유하고 클래스?


제 (스트리핑) 뷰 모델 :

public RelayCommand WindowClosedCommand { get; private set; } 

    public MainCommandsViewModel() 
    { 
     WindowClosedCommand = new RelayCommand(WindowClosedCommandOnExecuted, WindowClosedCommandOnCanExecute); 
    } 

MainWindow.xaml

<Window x:Class="TvShowManager.UserInterface.Views.MainWindow" 

     <!-- left out irrelevant parts --> 
     xmlns:closeBehaviors="clr-namespace:TvShowManager.UserInterface.CloseBehaviors" 
     closeBehaviors:WindowClosedBehavior.Closed="{Binding WindowCloseCommand}" > 

I 단순히 RelayCommand (WindowCloseCommand)를 결합 부착 속성.


내가 더 잘 이해하고 희망을 진행하는 방법을 알아 내기 위해이를 통해 디버깅을 시도했지만 중단 점은 내 연결된 속성을 보유하고있는 클래스에서 때린되고있다. 아무도 왜 내 코드가 WindowClosedBehavior에 처형되지 않는다고 설명 할 수 있다면 거기에있는 조언에 크게 감사 할 것입니다.

나는 달성하려는 목표와 누군가가 나를 도울 수 있기를 바랍니다.

많은 감사

ClosedChanged 콜백 내에서
+0

궁금한 점 : WindowCloseCommand에 직접 바인딩하여 원하는 결과를 얻지 않는 이유는 무엇입니까? – WAQ

+0

@WQad, 어떤 속성을 명령에 바인딩하겠습니까? – bas

답변

2

, 단지 명령을 호출하는 명령을 저장하고 윈도우의 Closed 이벤트에 이벤트 핸들러를 등록 :

private static ICommand _command; 

private static void ClosedChanged(
    DependencyObject target, 
    DependencyPropertyChangedEventArgs e) 
    { 
     var window = target as Window; 

     if (window != null) 
     { 
      _command = e.NewValue as ICommand; 
      window.Closed += (sender, args) => 
      { 
       if (_command != null) 
        _command.Execute(null); 
      } 
     } 
    } 

또한, 당신이되지 않는다는 것은 할 수 있습니다를 윈도우의 Closed 이벤트에 기존의 모든 이벤트 핸들러를 등록하십시오. 런타임 중에 WindowClosedBenahior을 변경하려는 경우에만 필요합니다.

+0

연결된 속성 자체가 ICommand를 가리킬 때 값을 저장할 필요가 없습니다. –

+0

나는 이것을 시도 할 것이다. 글쎄, 이미했는데 디버깅을하는 동안 아무 일도 일어나지 않을 것이기 때문에 뭔가 제대로 설정되지 않았다 ... 연결된 속성의 설정자가 결코 실행되지 않으며 명령도 실행되지 않는다. 나는 일이 어떻게 진행되는지 알려줄 것이다. 지금까지의 팁을 고맙게 생각합니다 (그리고 이것이 작동해야한다는 인식의 일종). – bas

+0

Binding을 사용할 때 WPF가 setter를 호출하지는 않지만 DependencyProperty의 setter 내의 중단 점에 도달하지 않으면 혼동하지 마십시오. 반사 논리를 대신 사용합니다. 'ClosedChanged' 콜백의 첫 번째 줄에 중단 점을 추가 할 때 도달 했습니까? – andreask