MVVM Light和设置数据模型字段

6

这里是使用 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

欢迎提出任何解决此问题的想法。


有什么问题吗?第二个代码示例不等同于第一个吗? - Patrick Quirk
是的,它们是等效的,但我想要代码最小化。 - Json76
2
Set方法只是MVVMLight中触发属性更改通知的几种方式之一。您的第二个示例是完全有效的(尽管Set()在引发通知事件之前执行了相等比较)。 - olitee
1个回答

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接