Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF&;MVVM灯-通过Messenger使用按钮关闭子窗口_C#_Wpf_Mvvm_Mvvm Light - Fatal编程技术网

C# WPF&;MVVM灯-通过Messenger使用按钮关闭子窗口

C# WPF&;MVVM灯-通过Messenger使用按钮关闭子窗口,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,在我的项目中,我有一个子窗口,一次可以打开多个实例。它们获取对象的实例,显示有关该对象的信息,然后返回有关该对象的信息。现在它正在工作,但我必须关闭窗口,并在上角显示“X”。我希望能够用“接受”和“取消”按钮关闭窗口。如果单击“接受”,我希望让MVVM Light的messenger发回相应的数据(该数据已经正常运行)并关闭窗口。如果单击“取消”,则应放弃更改并关闭窗口。不幸的是,我不知道使用按钮关闭窗口的好方法(而且MVVM友好)。我已经研究过如何使用命令,但都没有用,我不知道该怎么做。任何帮

在我的项目中,我有一个子窗口,一次可以打开多个实例。它们获取对象的实例,显示有关该对象的信息,然后返回有关该对象的信息。现在它正在工作,但我必须关闭窗口,并在上角显示“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 {}