这是一个封闭的网络,我在互联网电脑上没有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 - 更新列表,但网格未更新...
也许你可以看到问题是什么?...
答案 0 :(得分:0)
我对此的初步想法是CurrentlySelectedRow.CardNumber
和CurrentlySelectedRow.CardCode
的更新不会调用OnPropertyChanged()
。
使用ObservableCollection
,如果添加或删除任何项目,UI将会更新,但如果对项目中的属性进行任何更改,则不会更新。
由于未进行任何调用,因此用户界面并不知道这些属性已更改。
您必须使Card
类工具INotifyPropertyChanged
与Elements
类似。
我通常会创建一个只实现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
,您可以尝试重新绑定绑定到INotifyPropertyChanged
和Elements.CardNumber
的任何内容,分别为Elements.CardCode
和CurrentlySelectedCard.CardNumber
。这可能允许您从CurrentlySelectedCard.CardCode
删除属性。
但这取决于你的其余代码。