绑定到ObservableCollection的列表框不会更新

我使用ObservableCollection来存储Windows的环境变量。

class VariableVieWModel { ObservableCollection vars; public ObservableCollection Variables { get { return vars; } set { vars = value; } } public VariableViewModel() { Reload(); } public void Reload() { // Code to retrieve vars } } 

此ObservableCollection绑定到ListBox。

我在GUI中添加了一个按钮来重新加载变量,在点击时,它调用Reload()过程。

但是,ListBox内容不会更改,并且在调用Reload()时我无法再将项添加到列表中。

在构造函数下,一切正常。

ListBox XAML:

  

我尝试使用PropertyChanged作为UpdateSource触发器并设置大多数模式。

 public void Reload() { vars = new ObservableCollection(); RegistryKey systemVarKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"); string[] systemVars = systemVarKey.GetValueNames(); foreach (string var in systemVars) { vars.Add(new VariableModel() { Name = var, Values = (systemVarKey.GetValue(var, null, RegistryValueOptions.DoNotExpandEnvironmentNames) as string).Split(';').ToList(), Target = EnvironmentVariableTarget.Machine }); } systemVarKey.Close(); RegistryKey userVarKey = Registry.CurrentUser.OpenSubKey(@"Environment"); string[] userVars = userVarKey.GetValueNames(); foreach (string var in userVars) { vars.Add(new VariableModel() { Name = var, Values = (userVarKey.GetValue(var, null, RegistryValueOptions.DoNotExpandEnvironmentNames) as string).Split(';').ToList(), Target = EnvironmentVariableTarget.User }); } userVarKey.Close(); } 

您需要为VariableVieWModel实现INotifyPropertyChanged以刷新目标对象绑定。 你只需这样做 –

 class VariableVieWModel : INotifyPropertyChanged { . . public ObservableCollection Variables { get { return vars; } set { if(vars!=value) { vars = value; OnPropertyChanged("Variables"); } } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } } 

您尚未修改ObservableCollection,只替换它。 您应该实现INotifyPropertyChanged并在Variables属性setter中调用PropertyChanged

BTW在MVVM实现中常见的是为ViewModel创建一个基类:

 class VariableViewModel : ViewModelBase 

并在基类中实现常用function,如INotifyPropertyChanged ,以避免重复代码。

问题是,可能你的VariableModel没有实现INotifyPropertyChanged 。 通过ObservableCollection,仅报告对集合的更改,而不是对包含的对象的更改。

在这里,您将找到一些实现可能性。