C# ObservableCollection不总是错误地更新UI和变量更改
我有下面的ViewModel,在我的代码中将其链接到items控件。但是,当我使用以下行时:C# ObservableCollection不总是错误地更新UI和变量更改,c#,wpf,xaml,data-binding,user-interface,C#,Wpf,Xaml,Data Binding,User Interface,我有下面的ViewModel,在我的代码中将其链接到items控件。但是,当我使用以下行时: onOffSchedule.dc.schedules[0].days[0].data[0] = 9; 它有时只更新用户界面??当它这样做的时候,它会错误地更新数据。而不是将第一个时间表、第一天和第一个时间段指定为9。它会在第一个时间段更新第一个时间表(所有天数??) 所以我试图弄明白为什么它会更新days数组中的每个索引,而不仅仅是第一个索引 提前谢谢 public class ScheduleVM
onOffSchedule.dc.schedules[0].days[0].data[0] = 9;
它有时只更新用户界面??当它这样做的时候,它会错误地更新数据。而不是将第一个时间表、第一天和第一个时间段指定为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.dc.schedules[0].days[0].data[0] = 9;
在正常情况下,该行不会触发更新。您所做的只是在整数数组中设置一个整数:
public int[] data { ... }
当整个数组发生变化时,您将OnPropertyChanged
调用放入其中。但当您只设置其中一个值时,WPF不知道发生了什么
通过在另一个类上使用
ObservableCollection
,您的想法是正确的。对于数据属性,您需要在天类中执行类似的操作。当我从BaseVM继承时,它包含一个INotifyPropertyChanged处理程序(这就是OnPropertyChanged方法)。这会做同样的事情吗?正如Tim在下面所说的,它只会在您分配属性时触发,例如myDay.data=newint[]{}代码>,但在指定数据数组中的单个元素时不会。当您这样做时,实际上并不是在为数据属性调用setter,因为它一直在更新,但在调用onOffSchedule.dc.schedules[0].days[0].data[0]=9时,我仍然有奇怪的行为;它将days数组中的所有8个索引更新为9I已在代码中设置断点并逐步执行代码,当它到达上面的行时,它会正确地更新指定的索引,但也会在指定的计划中每隔一天更新一次指定的时间段。是更新实际的数据对象,还是只是UI更新不正确数据对象(以及随后的UI)正在更新,但这是因为它们在内存中共享此行的相同数组:days.Add(new Day(){data=values});所有的日子都应该有相同的价值观吗?或者每天都应该有自己的一组值吗?是的,他们应该有各自的内存分配。这就解释了我的另一个bug。非常感谢。如果你需要在回答中把它具体化,就大声喊出来。但我想你们在这个问题上都很好我明白了,只是我的疏忽。再次感谢!
public int[] data { ... }