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

欢迎对如何解决此问题有任何想法。

最佳答案

该代码无效,因为“属性或索引器可能不会作为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);
}

关于c# - MVVM Light和设置数据模型字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30877137/

10-13 08:31