使用 INotifyChanged 实现 ObservableCollection

Implementing ObservableCollection with INotifyChanged

这是一个封闭的网络,我在互联网计算机上没有 VS,所以提前对代码的外观表示歉意。 这是我的视图模型的一部分:

public class Elements : INotifyPropertyChanged
{     
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(String p) 
    {​          
        if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(p));
    }

   private int _CardNumber;
   private int _CardCode;
   private Card _CurrentlySelectedRow;

   public int CardNumber
   {
          get { return _CardNumber; }
          set
          {
                if (value != _CardNumber)
                {
                         _CardNumber = value;
                         OnPropertyChanged("CardNumber");
                }
          }
  }

   public int CardCode
   {
          get { return _CardCode; }
          set
          {
                if (value != _CardCode)
                {
                         _CardCode = value;
                         OnPropertyChanged("CardCode");
                }
          }
  }

   public Card CurrentlySelectedRow
   {
          get { return _CurrentlySelectedRow; }
          set
          {
                if (value != _CurrentlySelectedRow)
                {
                         _CurrentlySelectedRow= value;
                         OnPropertyChanged("CurrentlySelectedRow");
                }
          }
  }

  public class Card
  {
       public int CardNumber { get; set; }
       public int CardCode { get; set; }

       public Card() {}
       public Card(int CardNumber_,  int CardCode_)
       {
             CardNumber = CardNumber_;
             CardCode = CardCode_;
        }
 }    

  private ObservableCollection<Card> _Cards { get; set; }
  public ObservableCollection<Card> Cards
  {
         get
         {
                  if (_Cards == null)
                        _Cards  = new ObservableCollection<Card>();
                  return _Cards;
         }
         set
         {
               _Cards = value;
               OnPropertyChanged("Cards");
         }
   }

  public bool UpdateCard()
  {
      //selected row in gridcontrol is binded to CurrentlySelectedRow
         CurrentlySelectedRow.CardNumber = CardNumber;
         CurrentlySelectedRow.CardCode = CardCode ;
  }   

 public bool AddCard()
  {
       Cards.Add(new Card(CardNumber, CardCode );
  }           

}​

由于网格不可编辑,行以外部形式更新,其中控件绑定到 cardNumber 和 cardCode,当按下 OK - 调用 UpdateCard()(如果我们在更新),并且如果我们添加,则调用 AddCard。 AddCard 工作 - 网格更新。 UpdateCard - 更新列表,但不更新网格...

也许您可以看出问题所在?...

我最初的想法是 CurrentlySelectedRow.CardNumberCurrentlySelectedRow.CardCode 的更新不会调用 OnPropertyChanged()

对于 ObservableCollection,如果添加或删除任何项目,UI 将更新,但如果对项目中的属性进行任何更改,则不会更新。

因为没有调用,UI不知道这些属性已经改变。

您必须使 Card class 实现 INotifyPropertyChanged 类似于 Elements

我通常会做的是创建一个简单地实现 INotifyPropertyChangedBaseObject class。这个 class 然后被我所有其他 classes:

继承
public abstract BaseObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string p) 
    {​          
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(p));
    }
}

然后只需更改 Card class 中的属性即可调用 OnPropertyChanged.

根据评论编辑以下内容:

现在您已经实现了 INotifyPropertyChanged,您可以尝试将绑定到 Elements.CardNumberElements.CardCode 的任何内容分别重新绑定到 CurrentlySelectedCard.CardNumberCurrentlySelectedCard.CardCode。这可能允许您从 Elements.

中删除属性

但这取决于您的其余代码。