如何通知有关ListBox项目的更改属性?

时间:2013-05-20 21:29:24

标签: c# windows-phone-7 xaml mvvm-light

那么,我有项目列表(存储在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;
    }

2 个答案:

答案 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,他提出了一些有用的建议。