ObservableCollection不总是更新UI,变量更改不正确

本文关键字:变量 不正确 UI 更新 ObservableCollection | 更新日期: 2023-09-27 18:22:20

我有下面的ViewModel,在我的代码中将它链接到一个items控件。但是,当我使用诸如之类的行时

onOffSchedule.dc.schedules[0].days[0].data[0] = 9;

它只是有时更新UI??当它这样做时,它会更新所有错误的数据。而不是将第一个时间表、第一天和第一个时隙分配给9。它会更新第一个时间段的第一个时间表(全天??)。

因此,我试图弄清楚为什么它会更新days数组中的每个索引,而不仅仅是第一个索引。

提前感谢!

public class ScheduleVM
{
    public ObservableCollection<Schedule> schedules { get; set; }
    private static ScheduleVM viewModel = null;
    public static ScheduleVM getInstance()
    {
        if (viewModel == null)
            viewModel = new ScheduleVM();
        return viewModel;
    }
    private ScheduleVM()
    {
        schedules = new ObservableCollection<Schedule>();
        for (byte i = 0; i < 32; i++)
            schedules.Add(new Schedule());
    }
}
public class Schedule
{
    public ObservableCollection<Day> days { get; set; }
    public Schedule()
    {
        days = new ObservableCollection<Day>();
        int[] values = new int[96];
        for (byte i = 0; i < 96; i++)
            values[i] = 3;
        for (byte i = 0; i < 8; i++)
            days.Add(new Day() { data = values });
    }
}
public class Day : BaseVM
{
    private int[] _data;
    public int[] data
    {
        get
        {
            return _data;
        }
        set
        {
            _data = value;
            OnPropertyChanged("data");
        }
    }
}

下面是与此代码一起使用的视图。这是我在另一个窗口中创建的用户控件(在该窗口中,用户控件被称为"onOffSchedule"

public ScheduleVM dc { get; private set; }
    public Schedule()
    {
        InitializeComponent();
        dc = ScheduleVM.getInstance();
        this.DataContext = dc;
        schedule.ItemsSource = dc.schedules[0].days;
    }

ObservableCollection不总是更新UI,变量更改不正确

onOffSchedule.dc.schedules[0].days[0].data[0] = 9;

在正常情况下,该行不会触发更新。您所做的只是在整数数组中设置一个整数:

public int[] data { ... }

整个数组发生更改时,您可以在其中放入OnPropertyChanged调用。但是,当您只设置其中一个值时,WPF并不知道发生了什么。

在其他类上使用ObservableCollection<Day>,您的想法是正确的。您需要在Day类中为数据属性执行类似的操作。

您正在更新数据数组中的一个元素。该数组不会触发属性更改通知,因此View不知道如何更新自己。让你的数据成为ObservableCollection,看看它是否有帮助。