2013-07-23 41 views
1

我有許多頁面,每個頁面都有自己的ViewModel,它繼承自BaseViewModelSilverlight中的雙向綁定靜態DateTime屬性

在某些頁面上有DatePicker控件,其中SelectedDate屬性綁定到BaseViewModel中的ReportDate屬性。

但是,我剛剛被告知,這些頁面上的DatePicker控件應該使用相同的日期,這意味着如果用戶在頁面1中更改了控件中的日期,當他導航到頁面2時,頁面2應該顯示

我的第一個想法是,用靜態DateTime屬性代替ReportDate屬性,但據我所知在Silverlight中這是不可能的(難點?)。

或者有沒有更好的方法來做到這一點?

回答

2

我不認爲這是困難的。這裏有一個例子

public class BaseViewModel 
{ 
    public DateTime ReportDate 
    { 
     get 
     { 
      return ClassHelper.StaticDate; 
     } 
     set 
     { 
      ClassHelper.StaticDate = value; 
      RaisePropertyChanged("ReportDate") 
     } 
    } 
} 

public static ClassHelper : IPropertyChaged 
{ 
    private static object sync = new object(); 
    private static DateTime staticDate; 
    public static DateTime StaticDate 
    { 
     get 
     { 
      return staticDate; 
     } 
     set 
     { 
      lock(sync) 
      { 
       staticDate = value;     
      } 
      RaisePropertyChanged("StaticDate") 
     } 
    } 
} 

,然後在BaseViewModel subsicribe到ClassHelper.PropertyChaged事件並在處理程序調用RaisePropertyChaged("ReportDate")

不要忘記退訂Dispose方法的事件BaseViewModel

當然,你可能需要更改其他認爲,但是這是基本思想。

希望能幫助你。

+0

請參閱[本答案](http://stackoverflow.com/a/251668/1136211),解釋爲什麼'lock(this)'不好。更好地鎖定私人靜態對象成員。 – Clemens

+1

我知道這是不好的,我強調它需要處理concurent變化的事實,但是因爲你提出了這個觀點,所以我對它進行了加密,謝謝 – Swift

+0

如何將INotifyPropertyChanged實現爲靜態類? – Jessica