2011-05-20 34 views
6

我正在使用MVVM Light Toolkit的V3 SP1處理Silverlight應用程序。通知所有屬性在ViewModel上已更改

我的申請完全是法文/英文。所有UI元素(按鈕,標籤等)和所有數據(模型)。我需要動態語言切換,這是完全實現的,並且可以處理來自資源文件的任何內容。我所苦惱的是ViewModels。

模型具有特定語言的性質鑑別儀表(DescriptionEn,DescriptionFr),並且使用當前區域性返回調用語言特定屬性的附加屬性調用LocalizedDescription。

當語言的變化(通過點擊一個按鈕),我提出和廣播(通過信使)一個屬性更改事件。

在每一個我的ViewModels的,我註冊接收屬性更改消息的語言交換。

我想通知ViewModel的所有屬性都發生了變化。

來源:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx

The PropertyChanged event can indicate all properties on the object have changed by using either null or String.Empty as the property name in the PropertyChangedEventArgs.

然而,由於該工具包的抽象變更活動的募集符合RaisePropertyChanged(...)我不能得到這個工作。我還檢查了takeit的來源,並發現RaisePropertyChanged調用VerifyPropertyName(..),然後返回一個錯誤,該屬性不屬於ViewModel。我還注意到VerifyPropertyName方法是由Conditional(「DEBUG」)引起的,但即使我選擇Release配置,仍會引發ArgumentException(「Property not found」)。

有誰知道的一種方式來獲得這種使用工具箱除了手動調用RaisePropertyChanged的視圖模型的每個屬性的工作?

後續:

基於從西蒙的評論,我試圖創建自己的類,它擴展ViewModelBase。我查看了CodePlex的源代碼並決定創建一個名爲RaiseAllPropertyChanged()的方法。它只是RaisePropertyChanged(string propertyName)的副本,但沒有參數,也沒有對VerifyPropertyName(...)的調用。我無法讓它工作。這是我的。

public class ViewModelBaseExtended : ViewModelBase 
{ 
    protected void RaiseAllPropertyChanged() 
    { 
     var handler = this.PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(String.Empty)); 
     } 
    } 
} 

但我得到一個編譯器錯誤:The event 'GalaSoft.MvvmLight.ViewModelBase.PropertyChanged' can only appear on the left hand side of += or -=。這是在ViewModelBase中使用的代碼的副本。

有人可以提供一些建議,如何讓這個工作?

解決方案:

我複製從ViewModelBase所有的代碼放到一個新的類。然後我添加了上面提到的方法RaisePropertyChanged(),它用String.Empty實例化PropertyChangedEventArgs類。這是我ViewModels的新子類。

再次感謝西蒙領先的方式!

+0

你爲什麼要通知所有呢? – Simon 2011-05-26 23:00:19

+0

我正在通知所有屬性,因爲我需要它們重新讀取其數據,因爲語言發生了變化。例如,我有一個ViewModel有10個屬性。這些屬性是具有法文和英文描述並在運行時以當前語言呈現的數據的集合。當前語言發生變化時,我需要通知所有屬性,以便他們的數據現在以新的當前語言呈現。儘管在實施上述解決方案時,我仍然在努力獲取數據來切換語言。但通知所有人的問題已經解決。 – 2011-05-27 17:53:17

回答

2

不幸的是,這是不可能的MVVMLight

當前代碼庫在短期內你有2個選擇

  1. 用戶自定義的基類。定製基類我的意思是「不從MVVMLight類繼承」

  2. 在發佈模式下下載並編譯MVVMLight。這將強制排除「VerifyPropertyName」方法。當然,你不會得到屬性名稱檢查的價值。

我相信Laurent Bugnion很快就會解決這個問題。

+0

我已經添加了一個跟蹤我的原始問題,並提出了一個新基類的建議。有什麼建議麼? – 2011-05-24 17:35:53

+0

@Vincenzo更新我的答案。你不能以這種方式訪問​​基類中的事件。您需要從頭開始創建您自己的自定義基類。 – Simon 2011-05-24 22:27:55

+0

@Vincenzo你在Twitter嗎?如果是這樣,請通過http://twitter.com/SimonCropp ping我,我們可以討論這個 – Simon 2011-05-24 22:31:40

1

較輕解決這個問題會一直在你的類重寫RaisePropertyChanged(字符串參數propertyName):

protected override void RaisePropertyChanged(string propertyName) 
    { 
     if (propertyName != null) 
     { 
      base.RaisePropertyChanged(propertyName); 
     } 
     else 
     { 
      var handler = PropertyChangedHandler; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(null)); 
      } 

     } 
    } 
2

如果你在2016年讀這篇文章,你可以使用ObservableObject,並通知所有的屬性已經改變了:

RaisePropertyChanged(string.Empty); 
相關問題