2010-09-10 72 views
2

我想要我的Mvvm-Light解決方案(WP7)中的類(稱爲PremiseServer)預訂從基類型派生的類的所有屬性更改(SysObject是基類,它來自ViewModel)。如何註冊以接收Mvvm-Light中的所有屬性更改

我有一套派生自SysObject的類。這些類具有不同類型的屬性(字符串,布爾值,整數等)。

當任何這些類的任何屬性發生更改時,我希望我的PremiseServer實例查看這些更改,然後進行Web服務調用以將數據推送到服務器。

我試圖這樣做,它不會被調用(現在對我來說很有意義,因爲這是獲得改變屬性不是SYSOBJECT,但SYSOBJECT的某些屬性):

Messenger.Default.Register<PropertyChangedMessage<SysObject>>(this, (action) => { 
    String location = ((SysObject)action.Sender).Location; // URL to POST to 
    Debug.WriteLine("PremiseServer PropertyChange - " + action.NewValue.ToString()); 
}); 

我也嘗試過下面(註冊字符串消息)和它的作品,但我不希望創建的其中之一爲每個屬性類型:

Messenger.Default.Register<PropertyChangedMessage<String>>(this, (action) => { 
    String location = ((SysObject)action.Sender).Location; // URL to POST to 
    Debug.WriteLine("PremiseServer PropertyChange - " + action.NewValue.ToString()); 
}); 

我也試過Register<PropertyChangeMessage<Object>以爲我會看到所有派生類型的郵件(我沒有)。

我真正想要的是「註冊所有屬性SysObject對象的任何屬性更改messags」。我怎樣才能做到這一點?

謝謝!

回答

5

您可以使用具有布爾標誌作爲最後一個參數的Register方法重載並將此標誌設置爲true來註冊PropertyChangedMessageBase。就像其名稱所示,此標誌允許您註冊消息類型或從此類型派生的所有消息。

請注意,在處理程序中,您需要將消息轉換爲您要處理的確切類型。

它有道理嗎? 歡呼聲, Laurent

+0

沒錯。完全理解並按預期工作。謝謝! – tig 2010-09-12 01:32:04

0

請注意這一點,因爲在您的應用程序中您調用RaisePropertyChanged(...)的地方,此註冊的偵聽器將看到PropertyChangedMessageBase。

您可能必須做一些事情,如:

// this registration ensures that if a broadcast is issued for RaisePropertyChanged the vm will acknowledge it and enable IsDirty. 
// NOTE: Do not broadcast from IsDirty or we will get into an endless loop here. 
Messenger.Default.Register<PropertyChangedMessageBase>(this, true, 
(m) => 
{ 
if (m.Sender != this) return; // we only listen for property changes on ourself 
if (IsStartingUp || IsShuttingDown) return; 

if (m.PropertyName != IsDirtyPropertyName && m.PropertyName != IsBusyPropertyName && m.PropertyName != IsStartingUpPropertyName && m.PropertyName != IsShuttingDownPropertyName) 
IsDirty = true; 
});