0

だから、私はアイテムのリスト(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);

EDIT 4:いくつかのアイテムで機能することがわかりました。変更されていないこれらのアイテムは、正常に機能しています。しかし、私がそれを変更し始めたとき、ある瞬間、PropertyChanged は null です。

EDIT 5:だから、私はちょうどプロジェクトを再開しました。すでに変更されているアイテム - まだ通知できません (PropertyChanged == null)。ただし、残りは正常に機能しています。

編集6:これまでのところ、問題は

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

2 に答える 2

0

監視可能なコレクションには、アイテムのコレクションの変更に関するイベント (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;
            }

これで通知が送信されます。Edit 6 と比較してください。

user2399170 のおかげで、彼はいくつかの有用な提案をしました。

于 2013-05-21T13:37:14.437 に答える