C# WPF ListView как изменить значение ячейки?

525
19 ноября 2017, 13:01

Есть класс Product

public class Product
{
    public string Title { get; set; }
    public int Number { get; set; }
    public int Price { get; set; }
    public string Placement { get; set; }
    public int NumPrice { get; set; }
}

Есть коллекция:

List<Product> products;

Так же добавление элемента в коллекцию:

products.Add(new Product { Title = "Adobe Photoshop", Number = 1, NumPrice = 10, Price = 20, Placement = "в наличии" });
LW.Items.Refresh();

Как изменить определенное значение. Допустим я хочу число Number заменить с единицы на 2, а также Adobe Photoshop заменить на Adobe Dreamviewer.

Answer 1

Ваша коллекция прикреплена к ListView через ItemsSource? Если да, то ваш класс Product должен имплементировать интерфейс INotifyPropertyChanged, и значение подхватится само.

При этом LW.Items.Refresh(); будет не нужно.

class Product : INotifyPropertyChanged
{
    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    protected bool Set<T>(ref T field, T value,
                         [CallerMemberName] string propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(field, value))
            return false;
        field = value;
        RaisePropertyChanged(propertyName);
        return true;
    }
    public event PropertyChangedEventHandler PropertyChanged;
    string title;
    public string Title
    {
        get { return title; }
        set { Set(ref title, value); }
    }
}
Answer 2
private void Button_Click_1(object sender, RoutedEventArgs e)
{
    // Находим нужный объект
    var product = products.FirstOrDefault(p => p.Title == "Adobe Photoshop");
    // Если что-то нашлось
    if (product != null)
    {
        // Меняем свойства
        product.Title = "Adobe Dreamviewer";
        // И просим контрол обновить данные
        LV.Items.Refresh();
    }
}

Более правильный подход, который позволит вам проектировать бизнес-логику в отрыве от представления - реализовать интерфейс INotifyPropertyChanged в вашем классе Product:

public class Product : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    string title;
    public string Title
    {
        get
        {
            return title;
        }
        set
        {
            title = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));
        }
    }
...

Контролы WPF поддерживают это и при получении события обновятся автоматически, без вызова Items.Refresh()

Обычно делают базовый класс и реализуют в нем INotifyPropertyChanged (примерно как в соседнем ответе). А все классы, которые будут выведены в GUI (VM-классы) наследуют от него, это позволяет повторно использовать код реализации INPC

READ ALSO
Клиент-сервер SSL на C#

Клиент-сервер SSL на C#

Дали в универе такое задание:

245
Не выводит колодки

Не выводит колодки

Не выводит две последние колодки, выводит только название и лого, а часы не выводит

212
Повтороная работа скрипта

Повтороная работа скрипта

У меня есть 5 блоков с ссылкамиПри нажатии на ссылку, должна появляться менюха в модальном окне

244
Как изменить выбранную опцию в select?

Как изменить выбранную опцию в select?

Доброго времени сутокКак можно выбрать соответствующую опцию в select при клике на одну из строк таблицы ? т

273