Назначение объекта другому не вызывает событие PropertyChanged в WPFC#

Место общения программистов C#
Anonymous
Назначение объекта другому не вызывает событие PropertyChanged в WPF

Сообщение Anonymous »

Я попытался изолировать свою проблему в очень простом (и работающем) проекте. Допустим, у меня есть простая модель с двумя полями, я настроил ее свойства и событие PropertyChanged. Это упрощенная реализация моей модели. Обратите внимание, что последний метод просто получает новый клиентский объект из списка и возвращает его:

Код: Выделить всё

public class Clients : INotifyPropertyChanged
{
private long _Id = 0;

public long Id
{
get { return this._Id; }
set {
this._Id = value;
RaisePropertyChanged("Id");
}
}

private String _Name = string.Empty;

public String Name
{
get { return this._Name; }
set {
if (value is null)
this._Name = string.Empty;
else
this._Name = value;
RaisePropertyChanged("Name");
}
}

public event PropertyChangedEventHandler? PropertyChanged;

internal void RaisePropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}

// Let's say this is a populated list with 100 clients with different ids and names
public static List clients = new List();
// ...method for loading the list with DB data

public static Clients? LoadClient(long id)
{
return clients.FirstOrDefault(x => x.Id == id);
}
}
И у меня есть простой файл .xaml для отображения данных одного клиента (идентификатор и имя). Каждый элемент управления пользовательского интерфейса имеет привязку к свойству клиента и триггеру обновления. У меня также есть две настроенные кнопки, которые будут вносить изменения в значения клиента:

Код: Выделить всё




Next
Random
Теперь давайте посмотрим на мой код .xaml.cs. Вот инициализация и код для двух кнопок: одна из них просто изменяет свойства клиента непосредственно в объекте DataContext, а другая просто назначает новый объект клиента клиенту DataContext:

Код: Выделить всё

public partial class ClientsPage : Page
{
private Models.Clients? client = null;

public ClientsPage()
{
InitializeComponent();

// Load all clients data in Models.Clients.clients list...
client = new Models.Clients();

DataContext = client;
}

private void btnNext_Click(object sender, RoutedEventArgs e)
{
client = Models.Clients.LoadClient(client.Id + 1);
}

private void btnRandom_Click(object sender, RoutedEventArgs e)
{
Random random = new Random();
client.Id = random.Next(999);
client.Name = "RANDOM";
}
}
  • Когда я устанавливаю DataContext, данные отображаются правильно в пользовательском интерфейсе -> ОК
  • Когда я вношу изменения напрямую в свойствах клиентского объекта изменения правильно отражаются в пользовательском интерфейсе -> OK
  • Но... когда я загружаю новый клиентский объект и назначаю его переменной, установленной как DataContext< /code>, пользовательский интерфейс не меняется, поскольку событие PropertyChanged не вызывается.
Конечно, эту ситуацию можно решить, назначив свойство значения вместо прямого назначения нового объекта:

Код: Выделить всё

private void btnNext_Click(object sender, RoutedEventArgs e)
{
Models.Clients newClient = Models.Clients.LoadClient(client.Id + 1);

this.client.Id = newClient.Id;
this.client.Name = newClient.Name;
}
Но это так утомительно в реальном проекте с множеством моделей и методов, которые могут загружать/изменять объект с большим количеством полей. Я ищу простой/масштабируемый способ создания события PropertyChanged, когда я назначаю новый объект переменной DataContext. Если вам нужна более подробная информация о моем коде или у вас есть какие-либо вопросы, я буду рад задать их.

Подробнее здесь: https://stackoverflow.com/questions/782 ... ent-in-wpf

Вернуться в «C#»