簡體   English   中英

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

[英]Prism WPF Event Aggregator Event Class Alternative

我正在開發一個具有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的通用類,並使用它來實現。 還是可以通過枚舉此線程來激發靈感? 在事件聚合器中將枚舉與事件類混合

您的服務可以使用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;
        }
    }

如果您的屬性可以像事件一樣命名,或者將屬性放在事件上,則可以使用反射來查找傳入事件的屬性。 但是,反射速度很慢,因此,如果您有很多事件,則可能需要某種類型的緩存。

喜歡的東西, 可能會為你工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM