2016-02-08 34 views
0

信息對問題的二傳手:籌措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>(); 
+0

當你把你的「的PropertyChanged」方法它真的取決於你的更新,做你想做的UI如何細粒。含義...如果你想所有字段進行更新(在UI)作爲在模型改變,那麼他們需要調用「的PropertyChanged」的方法來推動更改UI。 – Edd

+1

@Edd我正在測試不同的場景。我只能綁定到在視圖模型中實現'INotifyPropertyChanged'的屬性(或對象)。如果'Person'在它自己的類中(並實現'INotifyPropertyChanged'),並且我從ViewModel:'var person = new Person(){Name =「John」,Age = 34}執行此操作,則綁定不起作用。這是正常的嗎? – Jack

+0

好吧,讓我們佈局的....你有一個結合的人一個ObservableCollection一個列表框。當你添加/刪除一個「Person」到集合時,這個列表會自動更新,但是假設你也在列表的右邊顯示了「Selected」項目(Person),如果你的「Person」實現了「PropertyChanged」接口,那麼「所選項目」(人員)也會自動更新。如果沒有,那麼您將不得不刷新列表並再次選擇該項目以獲取當前值。如果你有一些代碼,我可以幫助你更好地指出。這有幫助嗎? – Edd

回答

1

1)好吧,如果你想要在對象實例上調用它,那麼每次你在綁定中使用你的類時都需要這樣做。當你在課堂上直接實施OnNotifyPropertyChanged時,你不需要關心它......

2)INotifyPropertyChanged的類不需要可觀察集合。但是,這是必須當你結合保藏中心做一些UI控件(ListBoxListView),並希望添加/刪除其元素。 Observable集合將確保UI得到更新。

1

的ObservableCollections對象......當添加,並從這個集合的UI將被通知的變化(頂層)移除。如果您有一個「ObservableCollection of Person」,並且您更改列表中某個對象(Person)的屬性,那麼UI將不會更新,除非您的「Person」類實現INotifyPropertyChanged接口,該接口可以放入基類所有的類都可以像你的例子那樣繼承。希望這會有幫助。

相關問題