У меня есть наблюдение под названием «машины». Он состоит из объектов с помощью машинной модели, и он связан с ListView. Свойства коллекции реализуют inotifycollectionChanged. Когда я обновляю коллекцию, ListView не обновляется, и я не смог определить, что я делаю не так. Я рассмотрел ответы, представленные здесь.
Add
Delete
Add
Delete
Add
Edit
Delete
< /code>
viewmodel < /p>
using GPI_EE_TOOLS_V3.Models;
using GPI_EE_TOOLS_V3.ViewModels.Helpers;
using Microsoft.Data.Sqlite;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GPI_EE_TOOLS_V3.ViewModels.Commands.PackageEditor;
using System.Transactions;
using System.ComponentModel;
namespace GPI_EE_TOOLS_V3.ViewModels
{
public class PackageEditorVM : INotifyPropertyChanged
{
private ObservableCollection machineFamilies;
private MachineFamilyModel selectedMachineFamily;
public PackageEditorVM()
{
packageFamilyAddCommand = new PackageFamilyAddCommand(this);
machineFamilyOKCommand = new MachineFamilyOKCommand(this);
machineFamilies = new ObservableCollection();
FetchData();
}
public event PropertyChangedEventHandler? PropertyChanged;
public ObservableCollection MachineFamilies
{
get => machineFamilies;
set
{
machineFamilies = value;
OnPropertyChanged(nameof(machineFamilies));
}
}
public MachineFamilyOKCommand machineFamilyOKCommand { get; set; }
public ObservableCollection MachinePackages { get; set; } = new ObservableCollection { };
public string NewFamilyName { get; set; }
public PackageFamilyAddCommand packageFamilyAddCommand { get; set; }
public MachineFamilyModel SelectedMachineFamily
{
get
{
return selectedMachineFamily;
}
set
{
selectedMachineFamily = value;
//Update the packages shown when the selected machine family changes
FetchPackages();
}
}
public void AddFamily()
{
Guid guid = Guid.NewGuid();
SqliteConnection connection = new SqliteConnection("DataSource=" + AppDataHelper.AppDataFolder + @"\gpieedb.db");
connection.Open();
SqliteCommand commandlocal = connection.CreateCommand();
using (var transaction = connection.BeginTransaction())
{
commandlocal.Transaction = transaction;
commandlocal.CommandText = @"INSERT into machinefamilies (familyname, familyguid) values ($familyname, $familyguid)";
var parameter_familyname = commandlocal.CreateParameter();
parameter_familyname.ParameterName = "$familyname";
commandlocal.Parameters.Add(parameter_familyname);
var parameter_familyguid = commandlocal.CreateParameter();
parameter_familyguid.ParameterName = "$familyguid";
commandlocal.Parameters.Add(parameter_familyguid);
parameter_familyguid.Value = guid;
parameter_familyname.Value = NewFamilyName;
commandlocal.ExecuteNonQuery();
transaction.Commit();
}
connection.Close();
FetchData();
}
private void FetchData()
{
MachineFamilies.Clear();
SqliteConnection connection = new SqliteConnection("DataSource=" + AppDataHelper.AppDataFolder + @"\gpieedb.db");
connection.Open();
SqliteCommand command = connection.CreateCommand();
command.CommandText = $"SELECT * FROM machinefamilies";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
MachineFamilyModel machineFamilyModel = new MachineFamilyModel(
(string)reader["familyname"],
Guid.Parse((string)reader["familyguid"])
);
MachineFamilies.Add(machineFamilyModel);
}
}
connection.Close();
}
private void FetchPackages()
{
MachinePackages.Clear();
SqliteConnection connection = new SqliteConnection("DataSource=" + AppDataHelper.AppDataFolder + @"\gpieedb.db");
connection.Open();
SqliteCommand command = connection.CreateCommand();
command.CommandText = $"SELECT * FROM machinepackages";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
MachinePackageModel machinePackage = new MachinePackageModel(
(string)reader["name"],
Guid.Parse((string)reader["familyguid"]),
Guid.Parse((string)reader["packageguid"])
);
MachinePackages.Add(machinePackage);
}
}
connection.Close();
}
private void OnPropertyChanged(string propertyname)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
}
}
}
< /code>
Модель < /p>
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GPI_EE_TOOLS_V3.Models
{
public class MachineFamilyModel : INotifyPropertyChanged
{
private string name;
private Guid guid;
public MachineFamilyModel(string name, Guid guid)
{
Name = name;
Guid = guid;
}
public string Name
{
get => name;
set
{
name = value;
OnPropertyChanged(nameof(Name));
}
}
public Guid Guid
{
get => guid;
set
{
guid = value;
OnPropertyChanged(nameof(Guid));
}
}
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... lection-is
ListView не обновляется при изменении Bound ObservableCollection. Коллекция сделана из свойств, которые реализуют inotif ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение