2009-07-24 62 views
1

我試圖第一次使用.NET 2.0 ApplicationSettings功能,並發現它有點...在某些方面令人費解。我希望有人能幫我弄清楚我哪裏出錯了。更新綁定控件到ApplicationSettings

我有一個通用設置類,我已經實現了這是ApplicationSettingsBase的一個子類。我已經實現了一個屬性,並對其進行了標記。這似乎工作

我試圖將一個列表框控件綁定到屬性,這也似乎工作。當我打開表單時,它加載屬性就好了。

我遇到的問題是,如果我想更新設置和數據綁定而不重新加載窗體,它似乎不工作。沒有方法來刷新綁定,並從我正在閱讀,它應該只是自動更新(ApplicationSettingsBase實現IPropertyChangeNotify,DataBindings應該訂閱..但它似乎並沒有工作)。如果您有DataBinding,您也不能手動更新列表框。

因此,這裏是我的代碼:

Settings.cs

public class Settings : ApplicationSettingsBase 
{ 
    public Settings() 
    { 
     if (FixedBooks == null) FixedBooks = new List<string>(); 
    } 

    [UserScopedSetting()] 
    public List<string> FixedBooks 
    { 
     get { return (List<string>)this["FixedBooks"]; } 
     protected set { this["FixedBooks"] = value; } 
    } 
} 

SettingsForm.cs

Settings _settings = new Settings(); 

private void SettingsForm_Load(object sender, EventArgs e) 
{ 
    lbFixedColumns.DataBindings.Add(new Binding("DataSource", _settings, 
     "FixedBooks", false, DataSourceUpdateMode.OnPropertyChanged)); 
} 

private void DoSomething() 
{ 
    _settings.FixedBooks.Add("Test"); 
} 

我的理解是,添加一些東西到的applicationSettings應該火IPropertyChangedNotify提醒控制綁定該屬性已更改,並強制它重新加載..但這似乎並沒有發生。

我錯過了什麼?

編輯:

我相信我知道是什麼問題。問題是我正在改變Settings類中集合的內容,但不改變實際屬性本身(這是集合本身)。我想我將不得不實際添加或刪除整個集合才能使IPropertyChangedNotify觸發,這不會發生。

我不確定這個問題的解決方案是什麼。

回答

1

您需要保存設置並重新加載它:

private void DoSomething() 
{ 
    _settings.FixedBooks.Add("Test"); 
    _settings.Save(); 
    _settings.Reload(); 
} 

我與你的編輯和您的評論一致。嘗試使用BindingList代替。

例子:

public class Settings : ApplicationSettingsBase 
{ 
    public Settings() 
    { 
     if (FixedBooks == null) FixedBooks = new BindingList<string>(); 
     FixedBooks.ListChanged += FixedBooks_ListChanged; 
    } 


    void FixedBooks_ListChanged(object sender, ListChangedEventArgs e) 
    { 
     this["FixedBooks"] = FixedBooks; 
    } 

    [UserScopedSetting()] 
    public BindingList<string> FixedBooks 
    { 
     get { return (BindingList<string>)this["FixedBooks"]; } 
     protected set { this["FixedBooks"] = value; } 
    } 
} 
+0

這不是一個好的選擇,因爲它破壞了不保存設置而取消的功能。我只想在應用或確定時調用Save()。 – 2009-07-24 01:44:40

0

好吧,不是一個很好的解決方案,而我希望有人有更好的一個,但這個工程:

private void DoSomething() 
{ 
    _settings.FixedBooks.Add("Test");  
    var old = _settings.FixedBooks; 
    _settings["FixedBooks"] = new List<string>(); 
    _settings["FixedBooks"] = old; 
} 

我試圖簡單地重新分配自己本身,但顯然在那裏有一些優化,檢測到這一點,並沒有觸發PropertyChanged。

我很樂意給出一個更好的解決方案的人的答案。

編輯:

好吧,我想我已經找到可接受的解決方案,這只是一個小k​​ludgey,並且不需要像上面無故新對象的創建。

好吧,首先,我添加了一個新的方法,以我的設置類:

public void FirePropertyChanged(string propertyName) 
{ 
    PropertyChangedEventArgs args2 = new PropertyChangedEventArgs(propertyName); 
    OnPropertyChanged(this, args2); 
} 

這讓我沒有實際改變屬性觸發PropertyChanged事件。然而,對於我來說,Binding類仍然有點太聰明,因爲它知道這個屬性並沒有真正改變......所以它什麼也不做。

private void DoSomething() 
{ 
    _settings.FixedBooks.Add("Test"); 
    lbFixedColumns.DataSource = null; 
    _settings.FirePropertyChanged("FixedBooks"); 
} 

所以,這個代碼假貨了Binding類,通過清除數據源,現在不能告訴該屬性沒有改變,所以它有拉最新版本的數據。即使它仍然有點臭,我可以忍受這一點。

EDIT2:

由於DRS指出,我本來應該使用的BindingList,而不是一個列表,使用的BindingList是正確的解決方案。

相關問題