2010-10-27 37 views
4

我正嘗試使用內置的.NET應用程序設置。因此,例如我有一個年份的用戶設置。.NET用戶設置事件處理程序

如果最終用戶更改了程序中的設置,我需要通過刷新顯示的數據進行響應。

目前,我有這樣的代碼如下做到這一點:

Settings.Default.PropertyChanged += SettingsChanged; 

//on year change clear out the grid and update the data 
private void SettingsChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "year") 
    { 
     grdStudentCourseSearch.DataSource = null; 
     grdStudentCourseSearch.DataMember = null; 
     UpdateData(); 
    }   
} 

正如你可以看到他們似乎只能是所有設置一個事件處理程序,我不得不使用e.PropertyName比較字符串查看哪個屬性發生了變化。有一個更好的方法嗎?如果我稍後更改屬性名稱,可能會被忘記。

回答

1

我相信沒有一個更好的方法(使用生成的設置類),由於設置類 的實施考慮一個簡單的字符串設置生成的類代碼:

public string Test { 
    get { 
     return ((string)(this["Test"])); 
    } 
    set { 
     this["Test"] = value; 
    } 
} 

正如你可以看到,它使用帶有字符串值的索引器 - 您沒有任何專門的TestChanged事件或一些此類事件。到OnPropertyChanged的調用是在索引二傳手:

set 
{ 
    SettingChangingEventArgs e = new SettingChangingEventArgs(propertyName, base.GetType().FullName, this.SettingsKey, value, false); 
    this.OnSettingChanging(this, e); 
    if (!e.Cancel) 
    { 
     base[propertyName] = value; 
     PropertyChangedEventArgs args2 = new PropertyChangedEventArgs(propertyName); 
     this.OnPropertyChanged(this, args2); 
    } 
} 
0

您可以在運行時創建一個變量併爲其分配當前設置,然後在將其與之前的變量進行比較後,只要更改一個變量即可。

1

您可以選擇執行這樣的設置:

class Settings 
{ 
    public event EventHandler YearChanged; 

    private int _year; 

    public int Year 
    { 
     get { return _year; } 
     set 
     { 
      if (_year != value) 
      { 
       _year = value; 
       OnYearChanged(EventArgs.Empty); 
      } 
     } 
    } 

    protected virtual void OnYearChanged(EventArgs e) 
    { 
     if (YearChanged != null) 
      YearChanged(this, e); 
    } 
} 

然後,你可以在YearChanged註冊事件。

1

不,這不是一個好主意。代碼是太脆。早點抓住這個。例如,在用戶界面級別,您可以使用任何代碼來設置設置值。它可以觸發事件,並且您將確切知道正在修改的內容。或者製作一箇中級助手課程。

0

在早期的.net框架(3.5我認爲)我們可以使用nameof關鍵字來避免魔術字符串,所以e.PropertyChange == nameof(Year)。所以當屬性標識符改變時,編譯器會提醒您。