0

所以,我有项目列表(存储在 ObservableCollection 中),如何通知项目的属性变化?

我有当前的解决方案:属性也在上升 NotifyPropertyChanged(),它似乎有效。但是,有时,属性被更改,但没有通知给视图(调试器显示私有字段包含新值,但屏幕显示仍然是旧值)。也许这是更好的方法?

EDIT1:是的,绑定是在双向模式下完成的。

EDIT2:刚刚发现有时 PropertyChanged 为空。为什么会这样?

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;
    }
4

2 回答 2

0

Observable 集合有关于更改项目集合的事件(CollectionChanged)。你应该订阅它。当您看到添加了新项目时,您需要订阅它(到 PropertyChanged)。当它从收藏中删除时,不要忘记取消订阅。

于 2013-05-20T22:17:50.180 回答
0

问题在于添加项目。

它应该是

var foundItem = shoppingList.FirstOrDefault(p => p.ean == item.ean);
            if (foundItem != null)
            {
                foundItem.Amount += 1;
                item.Amount = foundItem.Amount;
            }

现在它发送通知。将其与编辑 6 进行比较。

感谢user2399170,他提出了一些有用的建议。

于 2013-05-21T13:37:14.437 回答