信息對問題的二傳手:籌措OnPropertyChanged在每個屬性VS對象的實例
我想了解如何正確的對象和集合實施INotifyPropertyChanged
。
首先,這裏是我的ViewModelBase類:
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertychanged([CallerMemberName] string propertyName = "")
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
想想看,我有一個名爲Person
類:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Age { get; set; }
}
要使用INotifyPropertyChanged
,我所看到的大多數例子修改Person類像這樣:
public class Person
{
public int Id { get; set; }
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertychanged();
}
}
private string _age;
public string Age
{
get { return _age; }
set
{
_age = value;
OnPropertychanged();
}
}
}
看來t在對象的實例使用一個單一的時間當o工作完全一樣(如果有很多的屬性,這可能是有用的):
private Person _person;
public Person MyPerson
{
get { return _person; }
set
{
_person = value;
OnPropertychanged();
}
}
實際問題:
1 - 它(從碼量除外)有所作爲你是否呼籲每一個人財產經文OnPropertychanged()
上的對象的實例? (都被認爲好的做法呢?)
2 - 如果對象實例設置OnPropertychanged()
是很好的做法,我是正確的,以創建一個ObservableCollection
這樣?:
var PersonCollection = new ObservableCollection<MyPerson>();
當你把你的「的PropertyChanged」方法它真的取決於你的更新,做你想做的UI如何細粒。含義...如果你想所有字段進行更新(在UI)作爲在模型改變,那麼他們需要調用「的PropertyChanged」的方法來推動更改UI。 – Edd
@Edd我正在測試不同的場景。我只能綁定到在視圖模型中實現'INotifyPropertyChanged'的屬性(或對象)。如果'Person'在它自己的類中(並實現'INotifyPropertyChanged'),並且我從ViewModel:'var person = new Person(){Name =「John」,Age = 34}執行此操作,則綁定不起作用。這是正常的嗎? – Jack
好吧,讓我們佈局的....你有一個結合的人一個ObservableCollection一個列表框。當你添加/刪除一個「Person」到集合時,這個列表會自動更新,但是假設你也在列表的右邊顯示了「Selected」項目(Person),如果你的「Person」實現了「PropertyChanged」接口,那麼「所選項目」(人員)也會自動更新。如果沒有,那麼您將不得不刷新列表並再次選擇該項目以獲取當前值。如果你有一些代碼,我可以幫助你更好地指出。這有幫助嗎? – Edd