Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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_Mvvm - Fatal编程技术网

C# 可观察到的采集完全不工作

C# 可观察到的采集完全不工作,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一段代码: private ObservableCollection<Stats> _stats; public StatisticsViewModel() { Stats = new ObservableCollection<Stats>(); Stats.Add(new Stats() { Type = "Min", Price = 100, Legend = Legend.Default }); } public ObservableColl

我有一段代码:

private ObservableCollection<Stats> _stats;

public StatisticsViewModel()
{
    Stats = new ObservableCollection<Stats>();
    Stats.Add(new Stats() { Type = "Min", Price = 100, Legend = Legend.Default });
}

public ObservableCollection<Stats> Stats
{
    get 
    { 
        return _stats; 
    }
    set
    {
        if (_stats != value)
        {
            _stats = value;
            RaisePropertyChanged("Stats");
        }
    }
}
private observedcollection\u stats;
公共统计视图模型()
{
Stats=新的ObservableCollection();
添加(newstats(){Type=“Min”,Price=100,Legend=Legend.Default});
}
公共可观测收集统计数据
{
得到
{ 
返回统计数据;
}
设置
{
如果(_stats!=值)
{
_统计=价值;
RaisePropertyChanged(“统计数据”);
}
}
}
创建新集合时,将调用统计数据集。但是,当添加对象时,它不会,因此它不会执行RaisePropertyChanged

我可以做些什么来解决这个问题

创建新集合时,将调用统计数据集

对。这是因为代码正在设置调用setter方法的
Stats
属性

但是,在添加对象时,它不会执行,因此它不会执行RaisePropertyChanged

也对。在对象上调用
.Add
时,代码没有设置保存该对象的属性。因此,没有理由调用setter方法。在本例中,
Stats
属性本身没有被更改,您只是在与对象交互

我可以做些什么来解决这个问题

您可以订阅的
ObservableCollection
类。当集合本身发生更改时,将引发
CollectionChanged
事件;当集合上的属性值发生更改时,将引发
PropertyChanged
事件

例如,如果要在集合更改时处理事件,可以订阅该事件:

Stats.CollectionChanged += CollectionChangeHandler;

// elsewhere...

private void CollectionChangeHandler(object sender, NotifyCollectionChangedEventArgs e)
{
    // do something to respond to the changed collection
}

您可以为Stats集合的CollectionChanged事件注册一个处理程序,并每次调用
RaisePropertyChanged()
。但是您真的需要它吗?它工作得很好,向集合中添加项不会调用setter,实际上是对getter返回的集合调用
Add()
。如果您想在集合中添加或删除和项时执行某些操作,请连接到
CollectionChanged
事件,或者更简单地说:如果属性没有更改,它为什么会引发
PropertyChanged
?您是否确实尝试过将该属性绑定到某些ItemsControl的某些
ItemsSource
?我认为,当集合中只添加了一些项时,提升propertychanged不是必须的。一个
ObservableCollection
不会在其父对象上引发
propertychanged
事件。当添加或删除某些内容时,它会在自身上引发
CollectionChanged
事件。WPF知道
observateCollection
CollectionChanged
事件,因此它用于绑定的方式类似于
PropertyChanged
的工作方式。但是它们不是一个。但是在添加项目时,我应该如何更新UI?@Bv202:那么,您想对UI做什么?如果您想手动执行更新,那么可以在
CollectionChangeHandler
方法中执行。尽管如此,WPF会自动订阅
ObservableCollection
事件,因此如果相应地使用,它将自动更新。