2017-06-08 139 views
2

是否有一種更簡單的方法來綁定很多屬性?MVVM綁定很多屬性

所以,如果你有性能Person類:姓氏,名字,生日,性別,職稱,...

現在我這樣做對視圖模型的每個屬性:

public string _LastName; 
public string LastName 
{ 
    get { return _LastName; } 
    set { _LastName = value; 
      RaisePropertyChanged("LastName"); } 
} 

而且在XAML頁面上此綁定:

<TextBlock Text="{Binding FirstName}" /> 

現在的形象,如果Person對象有一個像20點的屬性.. 所以我的問題是我可以做這個在simpeler方式?

+0

可能重複的[自動INotifyPropertyChanged](https://stackoverflow.com/questions/527602/automatically-inotifypropertychanged) – ASh

回答

2

如果您實際上打算在運行時動態更新屬性,則只需要從數據綁定屬性的setter中提升PropertyChanged事件。否則,你可以使用自動實現的屬性沒有任何自定義邏輯:

public FirstName { get; set; } 

還有一個NuGet包稱爲Fody,可自動將簡單的公共屬性,充分INotifyPropertyChanged實現你:https://github.com/Fody/PropertyChanged

+0

謝謝我明天會看看它! – user7998549

0

最簡單的解決方法是使用一個自由DevExpress MVVM Framework提供的POCO mechanism 。 POCO將自動實施INotifyPropertyChanged並在您的視圖模型中爲所有公共虛擬屬性引發PropertyChanged事件。

當您使用ViewModelSource類創建您的視圖模型時,會發生所有魔法。您可以在XAML創建視圖模型:

<UserControl ... 
    DataContext="{dxmvvm:ViewModelSource Type=local:MyViewModel}"> 

或者在後臺代碼:

this.DataContext = ViewModelSource.Create(() => new MyViewModel()); 
0

PREMISE

在默認情況下MVVM,您的視圖模型沒有每財產提出通知。

典型案例:您從數據庫中獲得一些Person,在視圖中顯示它們,通過TextBoxes和其他控件對其進行修改,然後單擊「保存」將它們重新發送到數據庫。您可以通過每次調用數據庫時在視圖上設置DataContext來完成此操作。此操作引發對控件和每個子控件的綁定屬性的第一次更新,因此ViewModel綁定屬性的所有getter都會被調用一次,並且View將被ViewModel的值填充。當你在View上修改某些東西時,該綁定會將修改帶到相應的ViewModel屬性(即使是簡單的get-set屬性)。

在這種情況下,你只是罰款的東西,如:

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    //and so on... 
} 

你需要籌集視圖模型的屬性通知僅在該視圖必須聽一些屬性的變化。例如,此功能:Button「保存」已啓用當且僅當Person上的Name不爲空。在這裏,顯然Button必須能夠看到Name屬性何時更改,以便屬性設置者必須提高PropertyChanged事件。


一種可能實現:

以此爲基類的ViewModels:

protected abstract BaseViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    protected void SetAndNotifyIfChanged<T>(
     ref T field, T value, [CallerMemberName] string propertyName = null) 
    { 
     if (!EqualityComparer<T>.Default.Equals(field, value)) 
     { 
      field = value; 
      NotifyPropertyChanged(propertyName); 
     } 
    } 
} 

在派生類中,你可以寫每一個獲得設置屬性是這樣的:

class MyViewModel : BaseViewModel 
{ 
    public string MyProp 
    { 
     get { return _MyProp; } 
     set { SetAndNotifyIfChanged(ref _MyProp, value); } 
    } 
    private string _MyProp; 
} 

類型T和自動推斷參數propertyName

這是最短的那一塊的代碼,你可以寫,而不是從一個正常的全屬性,以便不同:

public string NormalProp 
    { 
     get { return _ NormalProp; } 
     set { _NormalProp = value; } 
    } 
    private string _MyProp; 

如果你不想每次都寫這段代碼,使用code snippet