davidweitzenfeld
davidweitzenfeld

Reputation: 1041

Refresh an ObservableCollection (overwrite)

How can I refresh the following 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);
    }
}

I changed the value of textProperties[,] and now I'd like to overwrite the previous content of the collection with the current content of textProperties[,].

What would be the simplest way to do this?

Any help would be appreciated.

Upvotes: 1

Views: 4043

Answers (2)

sepai
sepai

Reputation: 166

Start off by implementing INotifyPropertyChanged in your ViewModel as well as in the ServerProperties object. This way you can raise the PropetyChanged event which will pass back to the user interface.

ViewModel

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

Implementing this on the ServerProperties object as well will allow you to change the objects, at any level, and have it bubble up to the interface.

Lastly look into your population code and in order to get the property to update successfully first populate it to a List then re-initialise the ObservableCollection using the List.

Properties = new ObservableCollection<ServerProperties>(propertiesList);

This also allows you to better handle the creation of your ObservableCollection and perform tests before posting the output to the interface. Hope it helps.

Upvotes: 3

Igor Ralic
Igor Ralic

Reputation: 15006

For example, one of the simpler solutions could be

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

    }
}

Any time you wish to add new items to OC, just call the SetProperties method.

Upvotes: 1

Related Questions