2012-10-22 65 views
0

這將在數據綁定和實現INotifyPropertyChanged的其他大量線程中得到解答。但是,我仍然很難讓這個工作。Databinding Listbox Winforms

本質上我有兩個列表框,當用戶從第一個列表框中選擇服務器名稱時,第二個列表框應該提供該服務器上的數據庫列表。很簡單。但是,第二個列表框不顯示更新的數據庫列表。

這裏是代碼: 執行查詢並將數據添加到DatabaseList屬性的代碼。

 private void selection_Server_SelectionChangeCommitted(object sender, EventArgs e) 
    { 
     server = (string)selection_Server.SelectedItem; 
     try 
     { 
      ExecDBList(server, ref vm); 
     } 

管理窗口上使用的屬性的類。在主窗口初始化

public class VM : INotifyPropertyChanged 
{ 
    private static List<string> _dblist; 
    public List<string> DatabaseList 
    { 
     get 
     { 
      return _dblist; 
     } 
     set 
     { 
      if (_dblist != value) 
      { 
       _dblist = value; 
      }; 
     } 
    } 
    public VM() { } 

    void OnPropertyChanged(string PropertyName) 
    { 
      PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

一行代碼分配列表框的DataSource

  selection_RDM.DataSource = vm.DatabaseList; 

在得到這個工作,任何幫助,因爲我努力理解前面的答案數據綁定和使用PropertyChangedEventHandler不勝感激。

謝謝 理查德

+0

仍然沒有帶,儘管下面的評論我這方面的知識有所幫助得到了這個工作。 –

回答

0

嘗試這樣的_dblist設定值後加入OnPropertyChanged();

public List<string> DatabaseList 
{ 
    get 
    { 
     return _dblist; 
    } 
    set 
    { 
     if (_dblist != value) 
     { 
      _dblist = value; 
      OnPropertyChanged("DatabaseList"); 
     }; 
    } 
} 

沒有地方,你打電話通知,以便您的申請將不被某事通知已更改

或更好

更改您的OnPropertyChanged(string name)到私人無效NotifyPropertyChanged([CallerMemberName] String propertyName = "")

,並調用該方法,無需在同一個地方的屬性的名稱,那是我表現出你這樣的

if (_dblist != value) 
{ 
    _dblist = value; 
    NotifyPropertyChanged(); 
}; 
+0

謝謝,我是一個不叫它的白癡。不過,我有一箇舊版本,其中包括對OnPropertyChanged的調用。它仍然在調試失敗就行了的PropertyChanged時不工作,實際上(這一點,新PropertyChangedEventArgs(屬性名)); –

+0

我相信我還沒有做的是PropertyChanged事件鏈接到列表框本身?不知道我是否需要這樣做 –

0

不工作的WinForms最近,但與WPF的工作,你試過做

RaisePropertyChanged(「DatabaseList」);

這樣一來,你已經重新查詢私人列表中的條目後,勢必任何事情應當通知......哎源剛剛更新......得到的是一個新的名單了。