Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ObservableCollection不总是错误地更新UI和变量更改_C#_Wpf_Xaml_Data Binding_User Interface - Fatal编程技术网

C# ObservableCollection不总是错误地更新UI和变量更改

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

我有下面的ViewModel,在我的代码中将其链接到items控件。但是,当我使用以下行时:

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 { ... }