Prism WPF事件聚合器事件类替代

时间:2018-06-13 16:27:25

标签: c# wpf mvvm prism eventaggregator

我正在开发一个包含30多个属性的项目,这些属性不断使用数据绑定进行更新。我获取服务器发送的新值的方式是使用事件聚合器来更新属性。到目前为止,这是我如何运作

活动类

public class Zone1TempEvent : PubSubEvent<int>
{           
}

属性

private int _zone1Temp;

public int Zone1Temp
{
   get { return _zone1Temp; }
   set { SetProperty(ref _zone1Temp, value); }     
}

订阅

eventAggregator.GetEvent<Zone1TempEvent>().Subscribe(tempZone1Update);

方式

private void tempZone1Update(int value) { Zone1Temp = value; }

发布

 private void checkResponsability(ItemValueCallback itemValue)
        {
            switch ((string)itemValue.ClientHandle)
            {
                case "Zone1_Temp":
                    int Zone1Temp = Int32.Parse((string)itemValue.Value);
                    _eventAggregator.GetEvent<Zone1TempEvent>().Publish(Zone1Temp);
                    break;
            }
        }

然而,我无法想象这样做30次。我正在寻找替代方案。我想避免为每个事件创建一个类,以及每个属性的方法。是否可以有一个名为UpdatePropertyEvent的泛型类,并使用它来执行此操作。 或者也许用枚举来做这个线程的灵感? Mixing enums with event classes in an event aggregator 感谢

1 个答案:

答案 0 :(得分:0)

您的服务可以实现EventAggregator,而不是使用IPropertyChanged(并且从服务返回的模型可以,具体取决于您的方案)。这样你就必须对一个事件作出反应。

此外,您可以发布一个包含两个字符串值的事件,例如class ServerUpdatedEvent : PubSubEvent<PropertyValuePair>并进行解析和分发 到视图模型中的属性。

示例:

    // ...service...
    private void checkResponsability(ItemValueCallback itemValue)
    {
        _eventAggregator.GetEvent<ServerUpdatedEvent>().Publish(new PropertyValuePair((string)itemValue.ClientHandle,(string)itemValue.Value);
    }

    // ...view model or intermediate service...
    private void OnServerUpdate(PropertyValuePair data)
    {
        switch (data.Property)
        {
            case "Zone1_Temp": Zone1Temp = int.Parse(data.Value); break;
        }
    }

如果您的属性可以像事件一样命名,或者您在其上放置属性,则可以使用反射来查找传入事件的属性。但是反射很慢,所以如果你有很多事件,你可能需要某种类型的缓存。

this这样的东西也适合你。