Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 以MVVM的方式使用接口在viewModels之间进行通信_C#_Wpf_Mvvm_Interface_Service Layer - Fatal编程技术网

C# 以MVVM的方式使用接口在viewModels之间进行通信

C# 以MVVM的方式使用接口在viewModels之间进行通信,c#,wpf,mvvm,interface,service-layer,C#,Wpf,Mvvm,Interface,Service Layer,我曾尝试使用MVVM Light消息传递在不同的ViewModel之间进行通信,但随着时间的推移,它变得非常混乱,很难理解所有消息从何处传递,因此我想询问其他解决方案,如何使用接口在ViewModel之间进行通信。提供的代码工作得很好,但我不确定是否修改了接口以便以这种方式使用。。 因此,我在这里定义了实现它的接口和类: public interface ISelectProject { event EventHandler<SelectedProjectEventArgs>

我曾尝试使用MVVM Light消息传递在不同的ViewModel之间进行通信,但随着时间的推移,它变得非常混乱,很难理解所有消息从何处传递,因此我想询问其他解决方案,如何使用接口在ViewModel之间进行通信。提供的代码工作得很好,但我不确定是否修改了接口以便以这种方式使用。。 因此,我在这里定义了实现它的接口和类:

public interface ISelectProject
{
    event EventHandler<SelectedProjectEventArgs> MessageReceived;
    void ProjectSelected(...);       
}

public class SelectProject : ISelectProject
{
    public event EventHandler<SelectedProjectEventArgs> MessageReceived;
    public void ProjectSelected(..)
    {
        MessageReceived?.Invoke(this,new SelectedProjectEventArgs(...));
    }
}
我的问题是:

1) 这是否违反了MVVM实践

2) 这样在视图模型之间进行通信是否被认为是一种良好的做法

3) 此解决方案是否会带来任何风险,例如内存泄漏等

谢谢大家!

1) 这是否违反了MVVM实践

否。
ISelectedProject
基本上是一项共享服务。共享服务是一个类,它以解耦的方式为多个组件提供功能。有关更多信息和示例,请参阅

2) 这样在视图模型之间进行通信是否被认为是一种良好的做法

是的,如果你想让它们彼此分离

3) 此解决方案是否会带来任何风险,例如内存泄漏等


使用共享服务本身不会导致任何内存泄漏。但是,如果您的共享服务公开了一个事件,并且视图模型在未取消订阅的情况下对此事件进行了订阅,则该服务将使视图模型保持活动状态。

您是否可以与我共享一个用于通过接口传递消息的工作示例代码?我不能让它工作。
public class ViewModelA : ViewModelBase
{
    public ViewModelA(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.ProjectSelected;
    }
}

public class ViewModelB : ViewModelBase
{
    public ViewModelB(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.MessageReceived += (s, data) =>
        {
            ...
        };
    }
}

public class ViewModelC : ViewModelBase
{
    public ViewModelC(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.MessageReceived += (s, data) =>
        {
            ...
        };
    }
}