1

我有一个接口 INetworkAware 并且需要声明将强制每个类注册事件的方法

目前使用 prisms eventtaggregator 我们的实现如下。

    protected override void SetupEvents()
    {
        RegisterForEvent<PatientSelected>(OnPatientSelected);
        base.SetupEvents();
    }

SetupEvents 方法在 ViewModelbase 类中被声明为 virtual。在这种情况下,我们希望拥有上面提到的 INetworkAware 接口,除了从 ViewModelBase 派生之外,如果任何类有兴趣监听网络变化(网络离线/在线)并实现 INetworkAware 接口,我们希望有机制来强制他们为此注册事件使用相同的主体。例如,如果我们创建类

public class PatientInformationViewModel : ViewModelBase, INetworkAware
{
     protected override void SetupEvents()
     {
         RegisterForEvent<PatientSelected>(OnPatientSelected);
         base.SetupEvents();
     }

     INetworkAware.ListenForNetworkChange
     {
         RegisterForEvent<NetworkChangeEvent>(OnNetworkChange)
     }

     OnNetworkChange(NetworkChangeEvent networkstatus)
     {

     }
 }

NetworkChangeEvent 是一个示例 POCO 类

INetworkAware.ListenForNetworkChange 和 OnNetworkChange(NetworkChangeEvent networkstatus) 必须在派生自 INetworkaware 并具有相同签名的每个视图模型中实现。

我们怎样才能完成这个场景

4

1 回答 1

2

你几乎是在正确的轨道上。如果您在基类上实现接口,然后在基类中声明您的方法,abstract这将强制任何扩展(派生)类实现它自己的版本:

public abstract class ViewModelBase : INetworkAware
{

    public abstract void SetupEvents();

}

public class PatientInformationViewModel : ViewModelBase
{
    public override void SetupEvents()
    {
        //register for your events
    }
}

或者,您可以在基类中声明该方法,virtual而不是abstract提供一个基实现,并且您的派生类可以在必要时简单地覆盖它。我自己之前就使用过这种模式,它非常有效——只要确保你Unsubscribe()在界面上也包含一个(或类似的)。

于 2012-10-02T11:01:51.823 回答