gpt4 book ai didi

c# - ViewModel 属性的异常行为,未执行 RaisePropertyChanged

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:15 24 4
gpt4 key购买 nike

我注意到在将对象添加到 ViewModel 属性时 RaisePropertyChanged 有一个奇怪的行为。

private List<string> _items;
public List<string> Items
{
get
{
if(_items == null){ _items = new List<string>(); }
return _itmes;
}
set
{
_items = value;
RaisePropertyChanged("Items");
}
}

每当我通过属性向集合中添加对象时

Items.Add("new string");

RaisePropertyChanged 永远不会被调用。

让 RaisePropertyChanged 以我希望的方式运行的最佳方法是什么?

最佳答案

当您更改集合时将调用您的 setter,如果集合的内容已更改则不会。您需要的是一个通知您有关更改的集合。看 ObservableCollection<T> -类(class)。注册到其CollectionChanged通知更改的事件。

带有 setter 的属性
以下示例向您展示了如何使用包含可观察集合的可设置属性。该示例的复杂性是因为可以从实异常(exception)部设置集合。如果您不需要此功能,解决方案将变得更加简单。

private ObservableCollection<string> _items;
public ObservableCollection<string> Items {
get {
if (_items == null) {
// Create a new collection and subscribe to the event
Items=new ObservableCollection<string>();
}
return _items;
}
set {
if(value !=_items){
if (null != _items) {
// unsubscribe for the old collection
_items.CollectionChanged -= new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_items_CollectionChanged);
}
_items = value;
if (null != _items) {
// subscribe for the new collection
_items.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_items_CollectionChanged);
}
// Here you will be informed, when the collection itselfs has been changed
RaisePropertyChanged("Items");
}
}
}

void _items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
// Here you will be informed, if the content of the collection has been changed.
}

没有 setter 的属性
如果您不需要设置集合,请注册到 CollectionChanged在创建集合时。但是,您必须删除您的属性(property)的二传手。否则,如果集合已更改,则不会通知更改:

private ObservableCollection<string> _items; 
public ObservableCollection<string> Items {
get {
if (_items == null) {
// Create a new collection and subscribe to the event
_items=new ObservableCollection<string>();
_items.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler
}
return _items;
}
}

void _items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
// Here you will be informed, if the content of the collection has been changed.
}

附加信息
INotifyCollectionChanged 有关集合更改的更多信息。上面的例子你也可以使用更通用的 IEnumerable<string>INotifyCollectionChanged .

关于c# - ViewModel 属性的异常行为,未执行 RaisePropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4879947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com