INotifyPropertyChanged не обновляет пользовательский интерфейс для нескольких свойств [дубликат]C#

Место общения программистов C#
Anonymous
INotifyPropertyChanged не обновляет пользовательский интерфейс для нескольких свойств [дубликат]

Сообщение Anonymous »

После вызова таких методов, как Sieg(), пользовательский интерфейс не всегда корректно обновляется для всех связанных свойств.
Мне интересно
  • Правильна ли моя реализация Notify() для нескольких свойств?
  • Нужно ли мне также уведомлять для Nation или только для свойств, которые изменяются?
  • Есть ли лучший шаблон для обработки INotifyPropertyChanged в этом случае?
Я хочу, чтобы пользовательский интерфейс надежно обновлялся при каждом изменении Punkte или Spiele.
using Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ViewModel
{
public class VMMannschaft : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;

private Mannschaft mannschaft;

public string Nation { get => mannschaft.Nation; }
public int Punkte { get => mannschaft.Punkte; }
public int Spiele { get => mannschaft.Spiele; }

public VMMannschaft(string nation)
{
mannschaft = new Mannschaft(nation);
}

public void Sieg()
{
mannschaft.Sieg();
Notify();
}

public void Niederlage()
{
mannschaft.Niederlage();
Notify();
}

public void Unentschieden()
{
mannschaft.Unentschieden();
Notify();
}

public void Notify()
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Punkte)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Spiele)));
}

public override string ToString()
{
return Nation;
}
}
}

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ViewModel
{
public class VMMainWindow
{
private ObservableCollection mannschaften;
private UserCommand siegCommand;
private UserCommand niederlangenCommand;
private UserCommand unentschiedenCommand;

public ObservableCollection Mannschaften { get => mannschaften; }
public UserCommand SiegCommand { get => siegCommand;}
public UserCommand NiederlangenCommand { get => niederlangenCommand;}
public UserCommand UnentschiedenCommand { get => unentschiedenCommand;}

public VMMainWindow()
{
mannschaften = new ObservableCollection();
MannschaftenLaden();

siegCommand = new UserCommand(new Action(Sieg));
niederlangenCommand = new UserCommand(new Action(Niederlangen));
unentschiedenCommand = new UserCommand(new Action(Unentschieden));
}

private void MannschaftenLaden()
{
mannschaften.Add(new VMMannschaft("Duetschland"));
mannschaften.Add(new VMMannschaft("Frankreich"));
mannschaften.Add(new VMMannschaft("Spanien"));
mannschaften.Add(new VMMannschaft("Italien"));
}

private void Sieg(object obj)
{
if (obj is VMMannschaft m)
m.Sieg();
}

private void Niederlangen(object obj)
{
if (obj is VMMannschaft m)
m.Niederlage();
}

private void Unentschieden(Object obj)
{
if (obj is VMMannschaft m)
m.Unentschieden();
}
}
}




























































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