代码之家  ›  专栏  ›  技术社区  ›  davidweitzenfeld

刷新ObservableCollection(覆盖)

  •  1
  • davidweitzenfeld  · 技术社区  · 11 年前

    如何刷新以下内容 ObservableCollection ?

    public class ViewModelProperties
    {
        private ObservableCollection<ServerProperties> properties;
    
        public ObservableCollection<ServerProperties> Properties
        {
            get
            {
                properties = new ObservableCollection<ServerProperties>();
    
                for (var lineNumber = 0; lineNumber < MainWindow.lineCount; lineNumber++)
                {
                    if (MainWindow.textProperties[lineNumber, 0] == null) break;
    
                    properties.Add(new ServerProperties(MainWindow.textProperties[lineNumber, 0],
                                                        MainWindow.textProperties[lineNumber, 1]));
                }
    
                return properties;
            }
        }
    }
    
    public class ServerProperties
    {
        private string property;
        private string value;
    
        public ServerProperties()
        {
        }
    
        public ServerProperties(string property, string value)
        {
            Property = property;
            Value = value;
        }
    
        public string Property
        {
            get
            {
                return this.property;
            }
            set
            {
                this.property = value;
            }
        }
    
        public string Value
        {
            get
            {
                return this.value;
            }
            set
            {
                this.value = value;
            }
        }
    
        public override string ToString()
        {
            return string.Format("[Property : {0}]", Value);
        }
    }
    

    我更改了的值 textProperties[,] 现在我想用的当前内容覆盖集合的以前内容 text属性[,] .

    做这件事最简单的方法是什么?

    任何帮助都将不胜感激。

    2 回复  |  直到 11 年前
        1
  •  2
  •   sepai    11 年前

    首先在ViewModel和ServerProperties对象中实现INotifyPropertyChanged。通过这种方式,您可以引发PropertyChanged事件,该事件将传递回用户界面。

    视图模型

    public class ViewModelProperties : INotifyPropertyChanged {
    
    public event ProeprtyChangedEventHandler PropertyChanged;
    
    private ObservableCollection<ServerProperties> properties = new ObservableCollection<ServerProperties>();
    
    public ObservableCollection<ServerProperties> Properties {
        get { return properties;}
        set {
            properties = value;
            this.RaisePropertyChangedEvent("Properties");
        }
    }
    
    private void RaisePropertyChanged(string propertyName) {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    }
    

    在ServerProperties对象上实现这一点也将允许您在任何级别更改对象,并使其冒泡到接口。

    最后查看您的填充代码,为了使属性成功更新,首先将其填充到列表中,然后使用列表重新初始化ObservableCollection。

    Properties = new ObservableCollection<ServerProperties>(propertiesList);
    

    这也允许您更好地处理ObservableCollection的创建,并在将输出发布到接口之前执行测试。希望能有所帮助。

        2
  •  1
  •   Igor Ralic    11 年前

    例如,一个更简单的解决方案可以是

    public class ViewModelProperties
    {
        private ObservableCollection<ServerProperties> properties = new ObservableCollection<ServerProperties>();
    
        public ObservableCollection<ServerProperties> Properties
        {
            get
            {
                return properties;
            }
        }
    
        public void SetProperties()
        {
            properties.Clear();
            for (var lineNumber = 0; lineNumber < MainWindow.lineCount; lineNumber++)
            {
                if (MainWindow.textProperties[lineNumber, 0] == null) break;
    
                properties.Add(new ServerProperties(MainWindow.textProperties[lineNumber, 0],
                                                    MainWindow.textProperties[lineNumber, 1]));
            }
    
        }
    }
    

    任何时候,只要调用SetProperties方法,就可以向OC添加新项目。