使用INotifyChanged实现ObservableCollection

时间:2016-04-14 11:17:58

标签: c# wpf gridcontrol

这是一个封闭的网络,我在互联网电脑上没有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 - 更新列表,但网格未更新...

也许你可以看到问题是什么?...

1 个答案:

答案 0 :(得分:0)

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

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

由于未进行任何调用,因此用户界面并不知道这些属性已更改。

您必须使Card类工具INotifyPropertyChangedElements类似。

我通常会创建一个只实现BaseObject的{​​{1}}类。然后,我的所有其他类继承此类:

INotifyPropertyChanged

然后只需更改public abstract BaseObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string p) {​ if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(p)); } } 课程中的属性即可调用Card

从评论中编辑以下内容:

现在您已经实施了OnPropertyChanged,您可以尝试重新绑定绑定到INotifyPropertyChangedElements.CardNumber的任何内容,分别为Elements.CardCodeCurrentlySelectedCard.CardNumber。这可能允许您从CurrentlySelectedCard.CardCode删除属性。

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