2014-10-05 78 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