Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用INotifyChanged实现ObservableCollection_C#_Wpf_Gridcontrol - Fatal编程技术网

C# 使用INotifyChanged实现ObservableCollection

C# 使用INotifyChanged实现ObservableCollection,c#,wpf,gridcontrol,C#,Wpf,Gridcontrol,这是一个封闭的网络,我在互联网上的计算机上没有VS,所以事先对代码的外观表示抱歉。 以下是我的视图模型的一部分: public class Elements : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(String p) {​ if (P

这是一个封闭的网络,我在互联网上的计算机上没有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 );
  }           

}​
公共类元素:INotifyPropertyChanged
{     
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串p)
{​          
if(PropertyChanged!=null)
房地产变更(这是新的房地产变更发展(p));
}
私人国际卡号;
私人国际卡代码;
私人卡(目前选择的流动卡);;
公共int卡号
{
获取{return\u CardNumber;}
设置
{
如果(值!=\u卡号)
{
_CardNumber=值;
OnPropertyChanged(“卡号”);
}
}
}
公共int卡码
{
获取{return\u CardCode;}
设置
{
如果(值!=\u卡片代码)
{
_CardCode=值;
OnPropertyChanged(“CardCode”);
}
}
}
公共卡当前已选Low
{
获取{return\u CurrentlySelectedRow;}
设置
{
如果(值!=\u CurrentlySelectedRow)
{
_CurrentlySelectedRow=值;
OnPropertyChanged(“CurrentlySelectedRow”);
}
}
}
公务舱卡
{
公共整数卡号{get;set;}
public int CardCode{get;set;}
公共卡(){}
公共卡(内部卡号、内部卡号)
{
CardNumber=CardNumber;
CardCode=CardCode;
}
}    
私有可观察收集卡{get;set;}
公共收款卡
{
得到
{
如果(_Cards==null)
_卡片=新的可观察集合();
退卡;
}
设置
{
_卡=价值;
不动产变更(“卡片”);
}
}
公共bool UpdateCard()
{
//gridcontrol中的选定行绑定到CurrentlySelectedRow
CurrentlySelectedRow.CardNumber=CardNumber;
CurrentlySelectedRow.CardCode=CardCode;
}   
公共bool AddCard()
{
卡。添加(新卡(卡号、卡号);
}           
}​
由于网格不可编辑,因此该行以外部形式更新,其中控件绑定到cardNumber和cardCode,当按OK时,将调用UpdateCard()(如果我们在更新中),并在添加中调用AddCard。 AddCard工作-网格更新。 UpdateCard-更新列表,但网格未更新


也许你可以看到问题出在哪里?…

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

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

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

您必须使您的
类实现
INotifyPropertyChanged
类似于
元素

我通常会创建一个
BaseObject
类,该类只实现
INotifyPropertyChanged
。该类然后由我的所有其他类继承:

public abstract BaseObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string p) 
    {​          
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(p));
    }
}
然后只需将
卡中的属性更改为调用
OnPropertyChanged

根据评论编辑以下内容:


现在您已经实现了
INotifyPropertyChanged
,您可以尝试分别将绑定到
元素.CardNumber
元素.CardCode
的内容重新绑定到
CurrentlySelectedCard.CardNumber
CurrentlySelectedCard.CardCode
。这可能会允许您删除该属性来自
元素的ies


但是,这将取决于代码的其余部分。

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

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

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

您必须使您的
类实现
INotifyPropertyChanged
类似于
元素

我通常会创建一个
BaseObject
类,该类只实现
INotifyPropertyChanged
。该类然后由我的所有其他类继承:

public abstract BaseObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string p) 
    {​          
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(p));
    }
}
然后只需将
卡中的属性更改为调用
OnPropertyChanged

根据评论编辑以下内容:


现在您已经实现了
INotifyPropertyChanged
,您可以尝试分别将绑定到
元素.CardNumber
元素.CardCode
的内容重新绑定到
CurrentlySelectedCard.CardNumber
CurrentlySelectedCard.CardCode
。这可能会允许您删除该属性来自
元素的ies


不过,这将取决于代码的其余部分。

如果可能,请使用Nuget的PropertyChanged/from来避免这种混淆。感谢weismat,我将对此进行研究,但这只会减少代码的混乱程度,不会解决我的问题……问题是为什么不更新网格。问题通常是绑定和数据上下文是否正确。这是正确的,因为添加和删除都是有效的