C# WPF AttachedProperty可在ViewModel中关闭窗口并对其进行操作

C# WPF AttachedProperty可在ViewModel中关闭窗口并对其进行操作,c#,wpf,mvvm,attached-properties,C#,Wpf,Mvvm,Attached Properties,我正试图将窗口关闭的事件重定向到我的ViewModel,但缺乏使用AttachedProperties的实际操作经验 保存AttachedProperty public class WindowClosedBehavior { public static readonly DependencyProperty ClosedProperty = DependencyProperty.RegisterAttached( "Closed", typeof (IC

我正试图将窗口
关闭的
事件重定向到我的ViewModel,但缺乏使用AttachedProperties的实际操作经验

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

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
时才是必要的。

只是好奇:为什么不直接绑定到WindowCloseCommand并获得所需的结果?@WQad,您建议将哪个属性绑定到命令?当附加属性本身指向ICommand时,不需要存储该值。我将尝试一下。好吧,我已经做了,但有些东西仍然没有正确设置,因为调试时似乎什么都没有发生。。。附加属性的setter永远不会执行,命令也不会执行。我会让你知道事情的进展。感谢到目前为止的提示(以及对这应该可以工作的确认!)如果未到达DependencyProperty的setter中的断点,请不要混淆,因为WPF在使用绑定时不调用setter,而是使用一些反射逻辑。当向
ClosedChanged
回调的第一行添加断点时,是否达到了要求?哦,还有一件事:Viewmodel中的命令名为
WindowClosedCommand
,但在XAML中,您绑定到
WindowCloseCommand
,而不使用d-可能这就是命令未被调用的原因?当我将您的代码复制到一个空项目中,包括我的事件处理程序解决方案,并更正输入错误时,它会工作,并且在关闭窗口后会调用命令方法!你是个明星!Thx提供所有三个部分的帮助:)。这个答案值得更多的投票!