c# - Prism WPF 事件聚合器事件类替代

标签 c# wpf mvvm prism eventaggregator

我正在开发一个具有 30 多个属性的项目,这些属性使用数据绑定(bind)不断更新。我获取服务器发送的新值的方式是使用事件聚合器,它会更新属性。到目前为止,这就是我的工作方式

事件类

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
谢谢

最佳答案

而不是使用 EventAggregator ,您的服务可以实现IPropertyChanged (并且从服务返回的模型可以,具体取决于您的场景)。这样,您只需对一个事件使用react。

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

例子:

    // ...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也可以为你工作。

关于c# - Prism WPF 事件聚合器事件类替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50842075/

相关文章:

c# - (MVVM/WPF) 在 View 模型中操作 View 元素

c# - 无法添加网络引用

c# - .NET 是否提供了一种将字节转换为 KB、MB、GB 等的简单方法?

c# - 安装其他 XLA 加载项时,VSTO 中的 Excel 加载项不起作用

c# - 页面只能有一个服务器端表单标签

c# - 需要发送鼠标和键盘事件WPF C#

c# - 来自项目资源的 WPF 绑定(bind)图像源

wpf - ScrollViewer 中的用户控件不会在 WPF 中滚动

c# - Prism MVVM,我应该将 IRegionManager 放在 ViewModel 中还是其他地方?

silverlight - 在 Silverlight Prism 应用程序中支持多个 "display modes"菜单