使用 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.CardNumber
和 CurrentlySelectedRow.CardCode
的更新不会调用 OnPropertyChanged()
。
对于 ObservableCollection
,如果添加或删除任何项目,UI 将更新,但如果对项目中的属性进行任何更改,则不会更新。
因为没有调用,UI不知道这些属性已经改变。
您必须使 Card
class 实现 INotifyPropertyChanged
类似于 Elements
。
我通常会做的是创建一个简单地实现 INotifyPropertyChanged
的 BaseObject
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.CardNumber
和 Elements.CardCode
的任何内容分别重新绑定到 CurrentlySelectedCard.CardNumber
和 CurrentlySelectedCard.CardCode
。这可能允许您从 Elements
.
中删除属性
但这取决于您的其余代码。
这是一个封闭的网络,我在互联网计算机上没有 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.CardNumber
和 CurrentlySelectedRow.CardCode
的更新不会调用 OnPropertyChanged()
。
对于 ObservableCollection
,如果添加或删除任何项目,UI 将更新,但如果对项目中的属性进行任何更改,则不会更新。
因为没有调用,UI不知道这些属性已经改变。
您必须使 Card
class 实现 INotifyPropertyChanged
类似于 Elements
。
我通常会做的是创建一个简单地实现 INotifyPropertyChanged
的 BaseObject
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.CardNumber
和 Elements.CardCode
的任何内容分别重新绑定到 CurrentlySelectedCard.CardNumber
和 CurrentlySelectedCard.CardCode
。这可能允许您从 Elements
.
但这取决于您的其余代码。