Событие PropertyChanged равно нулю после изменения значений внутри свойства - PullRequest
0 голосов
/ 22 октября 2018

У меня проблемы с обновлением пользовательского интерфейса после обновления моего свойства ObservableCollection.

Мой конструктор:

public ObservableCollection<Positions> Positions { get; set; }

        public BindableBase BindableBase { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            Positions = new ObservableCollection<Positions>();
            BindableBase = new BindableBase();

            Positions.Add(new Positions
            {
                Position1 = "Red",
                Position2 = "Red",
                Position3 = "Red",
                Position4 = "Gray",
                Position5 = "Green",
                Position6 = "Green",
                Position7 = "Green",
            });

            this.DataContext = this;
        }

Это оператор if, который изменяет значения внутри ObservableCollection, а затемЯ вызываю событие RaisePropertyChanged с именем моей собственности.Поскольку я не включил весь код, представьте, что он идет внутри ifstatement.

if (Positions[0].Position4 == "Gray")
            {
                Positions[0].Position1 = "Red";
                Positions[0].Position2 = "Red";
                Positions[0].Position3 = "Gray";
                Positions[0].Position4 = "Red";
                Positions[0].Position5 = "Green";
                Positions[0].Position6 = "Green";
                Positions[0].Position7 = "Green";

                BindableBase.RaisePropertyChanged("Positions");
            }

Это мой код для RaisePropertyChanged:

public class BindableBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

Проблема в том, что он необновить пользовательский интерфейс, если я вызываю событие RaisePropertyChanged.После некоторой отладки я обнаружил, что PropertyChanged имеет значение NULL, поэтому он не будет обновляться даже после внесения изменений.Кто-нибудь как решить эту проблему?

1 Ответ

0 голосов
/ 22 октября 2018

PropertyChanged всегда равно нулю, поскольку нет привязки, которая фактически использует значение свойства BindableBase в качестве исходного объекта (исходным объектом является MainWindow, DataContext = this).

К счастью, вы нездесь не нужна база данных Bindable.Positions является ObservableCollection и не нуждается в дополнительном уведомлении об изменении свойства.Если это необходимо, Positions должен быть свойством BindableBase, иначе запуск события PropertyChanged не имеет смысла.

Заменить

Positions[0].Position1 = "Red";
Positions[0].Position2 = "Red";
Positions[0].Position3 = "Gray";
Positions[0].Position4 = "Red";
Positions[0].Position5 = "Green";
Positions[0].Position6 = "Green";
Positions[0].Position7 = "Green";

на

Positions[0] = new Positions
{
    Position1 = "Red",
    Position2 = "Red",
    Position3 = "Gray",
    Position4 = "Red",
    Position5 = "Green",
    Position6 = "Green",
    Position7 = "Green",
};

Кроме тогочто, заменить комбинацию null check и PropertyChanged.Invoke на эту:

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