聞きたくない答えを教えます。これを行う必要はまったくありません。モデルには (full または auto) プロパティが必要であり、ViewModel プロパティには getter と を返す setter のみが必要_model.MyProperty
です。
CallerMemberName
また、その厄介な魔法の糸を取り除くために調べたいと思うかもしれません. 必要に応じて、いくつかの例を投稿します。
たとえば、DealsUser
モデル クラスがあります (電子メール アドレスが明示的に設定されていない場合に電子メール アドレスを生成するなどの内部ロジックがここでどのように行われるかに注意してください)。
public class DealsUser : IDealsUser
{
public DealsUser() : this("GUEST")
{
}
public DealsUser(string username)
{
this.Username = username;
this.IsAdministrator = false;
this.IsPlanModerator = false;
this.IsPlanner = false;
}
public string Username { get; set; }
public bool IsAdministrator { get; set; }
public bool IsPlanModerator { get; set; }
public bool IsPlanner { get; set; }
private string _emailAddress;
public string EmailAddress
{
get
{
return _emailAddress ?? string.Format(
"{0}@mycompany.co.za", this.Username);
}
set
{
_emailAddress = value;
}
}
public override string ToString()
{
return this.Username;
}
そしてBaseViewModel
、次のイベントと保護されたメソッドを持つクラスがあります (CallerMemberName
魔法の文字列を削除するために使用する方法に注意してください)。
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var eventHandler = this.PropertyChanged;
if (eventHandler != null)
{
eventHandler(this, new PropertyChangedEventArgs(propertyName));
}
}
protected bool SetProperty<T>(ref T storage, T value,
[CallerMemberName] string propertyName = null)
{
if (object.Equals(storage, value))
{
return false;
}
storage = value;
this.OnPropertyChanged(propertyName);
return true;
}
protected bool SetModelProperty<T>(T storage, T value, Action setter,
[CallerMemberName] string propertyName = null)
{
if (object.Equals(storage, value))
{
return false;
}
setter();
this.OnPropertyChanged(propertyName);
return true;
}
#endregion
次に、から継承しBaseViewModel
、モデルをコンストラクターに依存関係として挿入し、ViewModelをできるだけ無駄のない状態に保つようにします。SetModelProperty
の代わりに使用する必要があることに注意してください。これは、プロパティ (例: ) を参照変数として laamba 関数にSetProperty
渡すことができないためです。また、関連する通知プロパティが変更されたときに更新する追加のロジックが含まれていることに_dealsUser.Username
も注意してください。IsPlanner
IsPlanModerator
public class DealsUserVM : BaseViewModel
{
private readonly IDealsUser _dealsUser;
public DealsUserVM()
: this(new DealsUser())
{
// Empty ctor
}
public DealsUserVM(IDealsUser dealsUser)
{
_dealsUser = dealsUser;
}
public IDealsUser Model
{
get
{
return _dealsUser;
}
}
public string Username
{
get { return _dealsUser.Username; }
set
{
SetModelProperty(_dealsUser.Username, value,
() => { _dealsUser.Username = value; });
}
}
public bool IsAdministrator
{
get { return _dealsUser.IsAdministrator; }
set
{
SetModelProperty(_dealsUser.IsAdministrator, value,
() => { _dealsUser.IsAdministrator = value; });
}
}
public bool IsPlanModerator
{
get { return _dealsUser.IsPlanModerator; }
set
{
// If IsPlanModerator has changed (and was updated as a result)
if (SetModelProperty(_dealsUser.IsPlanModerator, value,
() => { _dealsUser.IsPlanModerator = value; }))
{
// If IsPlanModerator is now TRUE
if (value)
{
this.IsPlanner = true;
}
}
}
}
public bool IsPlanner
{
get { return _dealsUser.IsPlanner; }
set
{
// If IsPlanner has changed (and was updated as a result)
if (SetModelProperty(_dealsUser.IsPlanner, value,
() => { _dealsUser.IsPlanner = value; }))
{
// If IsPlanner is now FALSE
if (!value)
{
this.IsPlanModerator = false;
}
}
}
}
public string EmailAddress
{
get { return _dealsUser.EmailAddress; }
set
{
SetModelProperty(_dealsUser.EmailAddress, value,
() => { _dealsUser.EmailAddress = value; });
}
}
public override string ToString()
{
return _dealsUser.ToString();
}
}
お役に立てれば :-)