以下是使用MVVM Light的Set
方法的基本模式:
public class MyViewModel : ViewModelBase
{
private string _text;
public Text
{
get{ return _text; }
set{ Set(()=>Text, ref _text, value); }
}
}
但是在我的项目中,我将字段保存在DataModel类中,这对于克隆数据很好,副本可以用于取消修改:
public class MyDataModel
{
public string Text;
}
public class MyViewModel : ViewModelBase
{
private MyDataModel data;
public Text
{
get{ return data.Text; }
set{ data.Text = value; RaisePropertyChanged(()=>Text); }
}
}
但在这种情况下,我无法使用Set
方法,因为其第二个参数为ref
,我无法将data.Text
用作ref
参数。
Set( ()=>Text, ref data.Text, value ); // - its error
欢迎任何关于如何解决这个问题的想法。
答案 0 :(得分:0)
该代码无效,因为“属性或索引器可能无法作为out或ref参数传递”。您可以覆盖ViewModelBase并添加另一个Set重载,如下所示:
protected void Set<T>(Func<T> get, Action<T> set, T value, [CallerMemberName] string propertyName = null)
{
T currentValue = get();
if (EqualityComparer<T>.Default.Equals(currentValue, value))
return;
OnPropertyChanging(propertyName, currentValue);
set(value);
OnPropertyChanged(propertyName, value);
}
然后使用:
public string Text
{
get => data.Text;
set => Set(() => data.Text, x => data.Text = x, value);
}