C# 使用INotifyChanged实现ObservableCollection
这是一个封闭的网络,我在互联网上的计算机上没有VS,所以事先对代码的外观表示抱歉。 以下是我的视图模型的一部分: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
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,我将对此进行研究,但这只会减少代码的混乱程度,不会解决我的问题……问题是为什么不更新网格。问题通常是绑定和数据上下文是否正确。这是正确的,因为添加和删除都是有效的