2017-06-08 137 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