Проблемы с коллекцией ObservableCollection

Рейтинг: -1Ответов: 1Опубликовано: 05.11.2014

Приветствую.

Есть класс:

class ItemsC1
{
    public string ID { get; set; }
    public string Ping { get; set; }

   public ItemsC1(string ID, string Ping)
    {
        this.ID = ID;
        this.Ping = Ping;
    }
}

Нужно заменить элемент в этом классе на новый.

public partial class VrMonitor : Window
{
    ObservableCollection<ItemsC1> collection1 = new ObservableCollection<ItemsC1>();
    public VrMonitor()
    {
        collection1[0] = new ItemsC1 {ID="sdf",Ping="5"}; 
    }
}

Но не выходит, пишет:

NameSPD.ItemsC1 не содержит конструктор, который принимает 0 аргументов

Мне нужно в определенном элементе, например, collection1[5], изменить свойство Ping. Как такое можно сделать с этой коллекцией?

Обновление

Ну, если точно известен индекс, и там не null, то можно в лоб:

collection1[5].Ping = "новое значение"

Значение не null, значение меняется, но ObservableCollection прикреплён к ListView при таком добавлении в лоб, ListView не обновляет значение.

Вы уверены в правильности выбора типов переменных? В данном примере не уверен, пример просто для теста.

Обновление 2

Благодарю, то что нужно. В Интернете нашёл код при использовании кидает исключение. Ну да ладно, ваш код понятен и работает в моём случае. Спасибо!

public class People : INotifyPropertyChanged
{
      public event PropertyChangedEventHandler PropertyChanged;

      private string _firstName;

      public string FirstName
      {
            get { return _firstName; }
            set
            {
                _firstName = value;
                PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
            }
      }
}

Ответы

▲ 5Принят

Ошибка в строке

collection1[0] = new ItemsC1 {ID="sdf",Ping="5"};

Вы же сами описали класс с единственным конструктором, принимающим два аргумента, а приведенная выше строка "ищет" конструктор без аргументов. Эта запись эквивалентна

var a = new ItemsC1();
a.ID = "sdf";
a.Ping = "5";

Решения тут два:

  1. Вызвать таки описанный Вами конструктор: collection[0] = new ItemsC1("sdf", "5");. Что логичнее, если эти поля класса обязательные.
  2. Описать конструктор, который не будет принимать никаких аргументов:

    public ItemsC1() {

    }

Мне нужно в определенном элементе, например collection1[5], изменить свойство Ping. Как такое можно сделать с этой коллекцией?

Ну, если точно известен индекс, и там не null, то можно в лоб:

collection1[5].Ping = "новое значение"

Если же индекс неизвестен, то сначала надо найти нужный элемент. Можно "по-старинке" перебором, а можно прибегнуть к помощи LINQ:

ItemC1 item = collecion1.FirstOrDefault(x => x.ID == "sdf");
if (item != null)
{
    // Нашли нужный элемент
    item.Ping = "новое значение";
}

P.S. Вы уверены в правильности выбора типов переменных?


Реализация INotifyPropertyChanged:

public class ItemsC1 : INotifyPropertyChanged
{
    ...

    public event PropertyChangedEventHandler PropertyChanged; // Событие изменения данных

    // Для удобства оборачиваем вызов события в метод
    private void RaisePropetyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private string _ping;

    public string Ping
    {
        get { return _ping; }
        set
        {
            if (_ping == value)
                return;
            _ping = value;
            RaisePropertyChanged("Ping"); // Сообщаем об изменении
        }
    }
}

Теперь при изменении свойства Ping, ListView узнает об этом.