C# WPF&;MVVM灯-通过Messenger使用按钮关闭子窗口
在我的项目中,我有一个子窗口,一次可以打开多个实例。它们获取对象的实例,显示有关该对象的信息,然后返回有关该对象的信息。现在它正在工作,但我必须关闭窗口,并在上角显示“X”。我希望能够用“接受”和“取消”按钮关闭窗口。如果单击“接受”,我希望让MVVM Light的messenger发回相应的数据(该数据已经正常运行)并关闭窗口。如果单击“取消”,则应放弃更改并关闭窗口。不幸的是,我不知道使用按钮关闭窗口的好方法(而且MVVM友好)。我已经研究过如何使用命令,但都没有用,我不知道该怎么做。任何帮助都将不胜感激。我真的不知道在这种情况下发布什么代码C# WPF&;MVVM灯-通过Messenger使用按钮关闭子窗口,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,在我的项目中,我有一个子窗口,一次可以打开多个实例。它们获取对象的实例,显示有关该对象的信息,然后返回有关该对象的信息。现在它正在工作,但我必须关闭窗口,并在上角显示“X”。我希望能够用“接受”和“取消”按钮关闭窗口。如果单击“接受”,我希望让MVVM Light的messenger发回相应的数据(该数据已经正常运行)并关闭窗口。如果单击“取消”,则应放弃更改并关闭窗口。不幸的是,我不知道使用按钮关闭窗口的好方法(而且MVVM友好)。我已经研究过如何使用命令,但都没有用,我不知道该怎么做。任何帮
<Button x:Name="btnAccept"
Grid.Row="2"
Grid.Column="1"
Content="Accept"
Command="{Binding AcceptCommand}"/>
<Button x:Name="btnCancel"
Grid.Row="2"
Grid.Column="2"
Content="Cancel" />
如果多个子窗口为同一类型的消息注册 您需要确保此消息仅由正确的子窗口接收,或者所有子窗口将接收相同的消息,但只有正确的子窗口将关闭。 在这种情况下,消息需要包含一个具有正确值的属性,以便让子窗口确定它是否是要关闭的窗口 当您注册或发送消息时,MVVMLight具有名为“令牌”的功能 看看这个:
引入MVVM抽象允许您测试视图状态和行为。这确实不是您要测试的东西,因此最好在代码隐藏中处理。在这种情况下,我完全不反对使用代码隐藏。如果你愿意提出一个解决方案,让它发挥作用,我很乐意接受。实际上,Messenger发送的消息依赖于ViewModel的数据,因此我无法完全从代码隐藏关闭窗口。这是为什么设计的框架
ServiceLocator
没有为我设置.Get属性。这是我无法想象的。许多实现是不同的。由于您可能正在使用简单的Ioc和MVVM Light,我更新了我的答案。感谢您的更新。对于CloseWindowMessage
,我假设需要为此创建一个类。有什么特别需要包括的吗?您可以通过创建的Message类传递数据,但出于个人选择,我倾向于不通过消息传递数据。我更喜欢从负责数据的任何类获取数据。VS无法识别CloseWindowMessage
,这就是我认为必须使用自定义类的原因。
private void ExecuteAcceptCommand()
{
Messenger.Default.Send(Adv.Name);
//Close the window here somehow?
}
public class WindowClass
{
public WindowClass()
{
var messenger = ServiceLocator.Current.GetInstance<IMessenger>();
messenger.Register<CloseWindowMessage>(this, _ => Close());
}
}
public class CloseWindowMessage : MessageBase {}