Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 网格没有得到更新_C#_Wpf_Observablecollection - Fatal编程技术网

C# 网格没有得到更新

C# 网格没有得到更新,c#,wpf,observablecollection,C#,Wpf,Observablecollection,我的C#/WPF应用程序中有以下代码。单击Refresh按钮后,我在Viewmodel上调用GetData方法,并尝试重置可观察的集合。 但网格中的数据并没有得到更新。这里我做错了什么?CustomObservableCollection类中的重置方法逻辑正确吗 谢谢你的帮助 ViewModel.cs: private object _myLock = new object(); internal void GetData() { var data = .

我的C#/WPF应用程序中有以下代码。单击Refresh按钮后,我在Viewmodel上调用GetData方法,并尝试重置可观察的集合。 但网格中的数据并没有得到更新。这里我做错了什么?CustomObservableCollection类中的重置方法逻辑正确吗

谢谢你的帮助

ViewModel.cs:

private object _myLock = new object();
internal void GetData()
        {
            var data = ...//Get data from database

            lock (_myLock)
            {
                if (MyCollection != null )
                {
                    MyCollection.Reset(data);

                }
                else
                {
                    MyCollection = new CustomObservableCollection<Product>(data);
                }
            }
private object\u myLock=new object();
内部void GetData()
{
var data=…//从数据库获取数据
锁(_myLock)
{
if(MyCollection!=null)
{
MyCollection.Reset(数据);
}
其他的
{
MyCollection=新的CustomObservableCollection(数据);
}
}
XAML:



尝试将XAML代码更改为以下代码-

<... ItemsSource="{Binding Path=MyCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ... />

事实上,我认为重新初始化ObservableCollection比再次清除和重新添加项目要容易得多

public class CustomObservableCollection<T> : ObservableCollection<T>
{
    private object _lock = new object();
    public CustomObservableCollection()
        : base()
    {
    }

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        base.OnCollectionChanged(e);
    }

    public CustomObservableCollection(IEnumerable<T> collection)
        : base(collection)
    {
    }


    public void Reset(IEnumerable<T> range)
    {
        if (range == this)
        {
            return;
        }
        lock (_lock)
        {
            this.Items.Clear();

            foreach (var item in range)
          {
                this.Items.Add(item);
            }

            this.OnPropertyChanged(new PropertyChangedEventArgs("Count"));
            this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
            this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, range, 0));


        }


    }



}
<... ItemsSource="{Binding Path=MyCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ... />