2012-10-22 66 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”);

这样一来,你已经重新查询私人列表中的条目后,势必任何事情应当通知......哎源刚刚更新......得到的是一个新的名单了。