Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // old usage
- public class PersonViewModel : ViewModelBase<Person>
- {
- private int _id;
- public int ID
- {
- get { return _id; }
- set { Set(ref _id, value); }
- }
- // ....
- public abstract class ViewModelBase<T> : INotifyPropertyChanged
- {
- public T Model { get; private set; }
- public event PropertyChangedEventHandler PropertyChanged;
- protected virtual bool Set<K>(ref K storage, K value, [CallerMemberName] string propertyName = null)
- {
- if (!object.Equals(storage, value))
- {
- storage = value;
- OnPropertyChanged(propertyName);
- return true;
- }
- return false;
- }
- protected void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
- protected ViewModelBase(T model)
- {
- this.Model = model;
- }
- // NEW USAGE - workaround for passing Properties "as" reference
- public class Foo : VMBase<Person>
- {
- public int Age
- {
- get { return Model.Age; }
- set { Set(value, Model, x => x.Age, "Age"); }
- }
- public Foo(Person model)
- : base(model)
- {
- }
- }
- //and viewmodel base and Set method
- public T Model { get; set; }
- public event PropertyChangedEventHandler PropertyChanged;
- protected virtual void Set<T, I>(I input, T output, Expression<Func<T, I>> expr, [CallerMemberName] string propertyName = null)
- {
- var member = (MemberExpression)expr.Body;
- var prop = (PropertyInfo)member.Member;
- prop.SetValue(output, input, null);
- OnPropertyChanged(propertyName);
- }
- // WHERE T is type of model, I is type of input (property of model)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement