刷新ObservableCollection(覆盖)

时间:2013-04-09 23:49:22

标签: c# wpf collections observablecollection

如何刷新以下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[,]的值,现在我想用当前内容textProperties[,]覆盖集合的先前内容。

最简单的方法是什么?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

首先在ViewModel和ServerProperties对象中实现INotifyPropertyChanged。这样,您可以引发PropetyChanged事件,该事件将传回用户界面。

视图模型

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对象上实现它也可以让你在任何级别更改对象,并让它冒泡到界面。

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

Properties = new ObservableCollection<ServerProperties>(propertiesList);

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

答案 1 :(得分:1)

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

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]));
        }

    }
}

每当您想要向OC添加新项目时,只需调用SetProperties方法。