Prism WPF 事件聚合器事件 Class 备选方案
Prism WPF Event Aggregator Event Class Alternative
我正在开发一个项目,其中包含 30 多个属性,这些属性会使用数据绑定不断更新。我获取服务器发送的新值的方式是使用事件聚合器,它更新属性。到目前为止,这是我的工作方式
事件Class
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 次。我正在寻找替代方案。我想避免为每个事件创建一个 class,以及为每个 属性 创建一个方法。是否可以有一个通用的 class 称为 Update属性Event,并使用它来实现。
或者也许用枚举做一些受此线程启发的事情?
Mixing enums with event classes in an event aggregator
谢谢
您的服务可以实现 IPropertyChanged
而不是使用 EventAggregator
(服务返回的模型也可以,具体取决于您的场景)。这样你就只需要对一个事件做出反应。
此外,您可以只发布一个包含两个字符串值的事件,例如 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;
}
}
如果您的属性可以像事件一样命名,或者您将属性放在它们上面,则可以使用反射来查找传入事件的 属性。不过,反射速度很慢,因此如果您有很多事件,则可能需要某种类型的缓存。
之类的内容也适合您。
我正在开发一个项目,其中包含 30 多个属性,这些属性会使用数据绑定不断更新。我获取服务器发送的新值的方式是使用事件聚合器,它更新属性。到目前为止,这是我的工作方式
事件Class
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 次。我正在寻找替代方案。我想避免为每个事件创建一个 class,以及为每个 属性 创建一个方法。是否可以有一个通用的 class 称为 Update属性Event,并使用它来实现。 或者也许用枚举做一些受此线程启发的事情? Mixing enums with event classes in an event aggregator 谢谢
您的服务可以实现 IPropertyChanged
而不是使用 EventAggregator
(服务返回的模型也可以,具体取决于您的场景)。这样你就只需要对一个事件做出反应。
此外,您可以只发布一个包含两个字符串值的事件,例如 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;
}
}
如果您的属性可以像事件一样命名,或者您将属性放在它们上面,则可以使用反射来查找传入事件的 属性。不过,反射速度很慢,因此如果您有很多事件,则可能需要某种类型的缓存。