绑定到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,仅报告对集合的更改,而不是对包含的对象的更改。
在这里,您将找到一些实现可能性。