更改 属性 内的值后,PropertyChanged 事件为空
PropertyChanged event is null after changing values inside property
我在更新 ObservableCollection 属性 后更新 UI 时遇到问题。
我的构造函数:
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;
}
这是更改 ObservableCollection 内部值的 if 语句,然后我用 属性 的名称调用 RaisePropertyChanged 事件。因为我没有包含所有代码,所以假设它在 if 语句中。
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 事件,它不会更新 UI。经过一些调试后,我发现 PropertyChanged 的值为 NULL,因此即使我进行了更改,它也不会更新。有人知道如何解决这个问题吗?
PropertyChanged
始终为空,因为没有实际使用 BindableBase
属性 值作为源对象的绑定(源对象是 MainWindow,由 DataContext = this
).
幸运的是,您在这里不需要 BindableBase。 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
检查和PropertyChanged.Invoke
的组合替换为:
public void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
我在更新 ObservableCollection 属性 后更新 UI 时遇到问题。
我的构造函数:
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;
}
这是更改 ObservableCollection 内部值的 if 语句,然后我用 属性 的名称调用 RaisePropertyChanged 事件。因为我没有包含所有代码,所以假设它在 if 语句中。
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 事件,它不会更新 UI。经过一些调试后,我发现 PropertyChanged 的值为 NULL,因此即使我进行了更改,它也不会更新。有人知道如何解决这个问题吗?
PropertyChanged
始终为空,因为没有实际使用 BindableBase
属性 值作为源对象的绑定(源对象是 MainWindow,由 DataContext = this
).
幸运的是,您在这里不需要 BindableBase。 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
检查和PropertyChanged.Invoke
的组合替换为:
public void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}