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提供所有三个部分的帮助:)。这个答案值得更多的投票!