繁体   English   中英

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

[英]Listbox bound to an ObservableCollection doesn't update

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

class VariableVieWModel
{
    ObservableCollection<VariableModel> vars;

    public ObservableCollection<VariableModel> Variables
    {
        get
        {
            return vars;
        }
        set
        {
            vars = value;
        }
    }

    public VariableViewModel() 
    {
        Reload();
    }

    public void Reload()
    {
    // Code to retrieve vars
    }
}

此 ObservableCollection 绑定到 ListBox。

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

然而,ListBox 的内容并没有改变,在调用 Reload() 之后,我无法再向列表中添加项目。

在构造函数下一切正常。

列表框 XAML:

<ListBox x:Name="lbVariables" Grid.Column="0" Margin="0,0,5,0" ItemsSource="{Binding Source={StaticResource variablesViewModel}, Path=Variables}" IsSynchronizedWithCurrentItem="True"> 

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

public void Reload()
    {
        vars = new ObservableCollection<VariableModel>();

        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<string>(),
                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<string>(),
                Target = EnvironmentVariableTarget.User
            });
        }
        userVarKey.Close();
    }

您没有修改 ObservableCollection,只是替换了它。 您应该实现INotifyPropertyChanged并在Variables属性设置器中调用PropertyChanged

顺便说一句,在 MVVM 实现中,为您的 ViewModel 提供一个基本 class 是很常见的:

class VariableViewModel : ViewModelBase

并在基础 class 中实现INotifyPropertyChanged等常用功能,以避免重复代码。

您需要为您的 VariableVieWModel 实现INotifyPropertyChanged以刷新您的目标 object 绑定。 你只需要这样做 -

class VariableVieWModel : INotifyPropertyChanged
    { .
      .
            public ObservableCollection<VariableModel> 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));
                }
            } 
    }

问题是,您的 VariableModel 可能没有实现INotifyPropertyChanged 通过 ObservableCollection,只报告集合的变化,而不是包含对象的变化。

在这里你会发现一些实现的可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM