2013-05-20 97 views
0

所以,我有項目列表(存儲在ObservableCollection中),如何通知項目的屬性更改?如何通知有關更改ListBox項目的屬性?

我有當前的解決方案:屬性也上升NotifyPropertyChanged(),它似乎工作。但是,有時,屬性發生了變化,但未通知視圖(調試器顯示私有字段包含新值,但屏幕仍顯示舊值)。也許這是更好的方式嗎?

編輯1:是的,綁定是在雙向模式下完成的。

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

列表填寫虛擬機:

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爲null。

編輯5:所以,我剛剛重新啓動項目。那些已經更改的項目 - 它們仍然無法識別(PropertyChanged == null)。然而,其餘的工作正常。

編輯6:到目前爲止,問題是在

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

發佈您的代碼,否則很難提供幫助。 –

+0

@AlaaMasoud剛剛添加。有時它可以工作,但在某個時刻,它只是停止通知。我猜,導致PropertyChanged爲null。 –

回答

0

問題是添加項目。

應該

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

現在它發出通知。將其與Edit 6進行比較。

感謝user2399170,他提出了一些有用的建議。

0

觀察集合了有關更改項目(CollectionChanged)的回收事件。你應該訂閱它。當你看到新的項目被添加時,你需要訂閱它(到PropertyChanged上)。當它從收藏中刪除時不要忘記取消訂閱。

+0

我假設它是由ObservableCollection和setter完成的。因爲它基本上可行。但是有一段時間,它只是停止發送通知。壞事是我仍然不知道整個算法,如何重現問題。 –

+0

訂閱的地方在哪裏? – user2399170

+0

什麼是「設置」方法,以某種方式更新集合? – user2399170

相關問題