2014-10-05 42 views
0

我正在嘗試將窗口Closed事件重定向到ViewModel,但缺少正確使用AttachedProperties的經驗。WPF AttachedProperty關閉窗口並在ViewModel中對其執行操作

持有的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); 
    } 
} 

我如何能實現的行爲,這樣它會關閉該窗口,並觸發RelayCommand類?


的(剝離)視圖模型:

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

我簡單地結合一個RelayCommand(WindowCloseCommand)到附加屬性。


我試着調試通過這個來獲得更好的理解,希望找出如何進行,但沒有斷點在保持我的附加屬性的類被擊中。如果有人能解釋爲什麼我的代碼在WindowClosedBehavior從未得到執行,我也非常感謝那裏的建議。

我希望我很清楚自己想要達到的目標,並且有人可以幫助我。

非常感謝

+0

只是好奇:爲什麼不直接綁定到WindowCloseCommand並獲得所需的結果? – WAQ 2014-10-05 12:13:10

+0

@WQad,你建議綁定哪個屬性的命令? – bas 2014-10-05 12:47:44

回答

2

ClosedChanged回調,只是存儲的命令,並註冊一個事件處理程序窗口的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時無需存儲該值。 – 2014-10-05 12:49:35

+0

我會試試這個。那麼,我已經做了,但仍然沒有正確設置,因爲在調試時似乎沒有發生......附加屬性的setter永遠不會執行,也不是命令。我會讓你知道事情是如何解決的。感謝您提供迄今爲止的提示(以及確認這應該起作用) – bas 2014-10-05 12:56:19

+0

如果DependencyProperty的setter中的斷點未達到,請勿混淆,因爲在使用Binding時WPF不會調用setter,但會使用一些反射邏輯代替。在「ClosedChanged」回調的第一行添加斷點時,是否達到了? – andreask 2014-10-05 13:12:59