那么,我有项目列表(存储在ObservableCollection中),如何通知项目的属性变化?
我有当前的解决方案:属性也在上升NotifyPropertyChanged(),它似乎工作。但是,有时,属性会更改,但不会通知视图(调试器显示私有字段包含新值,但屏幕显示仍旧旧)。也许这是更好的方式吗?
EDIT1:是的,绑定是在TwoWay模式下完成的。
EDIT2:刚才发现有时PropertyChanged为null。为什么会这样?
EDIT3:代码非常基础。我正在使用非常常见的NotifyPropertyChanged()
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
设置器:
public double Amount
{
get
{
return amount;
}
set
{
amount = value;
NotifyPropertyChanged("Amount");
}
}
模型是继承的(只是发现它可能是个问题)
public class Item : INotifyPropertyChanged
更改金额:
var foundItem = shoppingList.FirstOrDefault(p => p.ean == item.ean);
if (foundItem != null)
{
foundItem.Amount += 1;
}
填写VM:
public class MyViewModel : BaseFoodieViewModel
{
private ObservableCollection<ProductSearchCategoryCollection<Item>> _itemsList = new ObservableCollection<ProductSearchCategoryCollection<Item>>();
public ObservableCollection<ProductSearchCategoryCollection<Item>> ItemsList
{
get { return _itemsList; }
set { Set(() => ItemsList, ref _itemsList, value); }
}
****
ItemsList.Clear();
var list = from item in parsedList
group item by item.code
into it orderby it.Key
select new ProductSearchCategoryCollection<Item>(it.Key, it);
ItemsList = new ObservableCollection<ProductSearchCategoryCollection<Item>>(list);
编辑4:刚想通了,它适用于多个项目。这些项目没有变化 - 它们工作正常。但是当我开始改变它时,PropertyChanged在某一时刻是空的。
编辑5:所以,我刚刚重启了项目。那些已经改变的项目 - 它们仍然无法通知(PropertyChanged == null)。但是,剩下的工作还可以。
编辑6:到目前为止,问题在于
var foundItem = shoppingList.FirstOrDefault(p => p.ean == item.ean);
if (foundItem != null)
{
foundItem.Amount += 1;
}
答案 0 :(得分:0)
Observable collection有关于更改项目集合的事件(CollectionChanged)。你应该订阅它。当您看到添加了新项目时,您需要订阅它(到PropertyChanged)。当它从收藏中删除时,不要忘记取消订阅。
答案 1 :(得分:0)
问题在于添加项目。
应该是
var foundItem = shoppingList.FirstOrDefault(p => p.ean == item.ean);
if (foundItem != null)
{
foundItem.Amount += 1;
item.Amount = foundItem.Amount;
}
现在它发送通知。将其与编辑6进行比较。
感谢用户2399170,他提出了一些有用的建议。