属性或索引器不能作为out或ref参数错误传递

时间:2016-01-19 19:53:58

标签: c# wcf mvvm-light

我的视图模型绑定到WCF服务中的对象。使用ObservableObject.Set<>时。我收到以下错误:

// Error: A property or indexer may not be passed as an out or ref parameter.
public string SomeProperty
{
    get { return _wcfObject.SomeProperty; }
    set { Set(nameof(SomeProperty), ref _wcfObject.SomeProperty, value); }
}

现在很明显我无法做到这一点,这些尝试的解决方法都无法解决。

// Error: } expected
public string SomeProperty
{
    get { return _wcfObject.SomeProperty; }
    set { 
            ref string v = _wcfObject.SomeProperty;
            Set(nameof(SomeProperty), ref v, value); 
        }
}

// Compiles, but property not updated.
public string SomeProperty
{
    get { return _wcfObject.SomeProperty; }
    set { 
            var v = _wcfObject.SomeProperty;
            Set(nameof(SomeProperty), ref v, value); 
        }
}

如何在不必将对象从WCF服务中包装的情况下使用MVVMLight?

1 个答案:

答案 0 :(得分:1)

当然它不起作用,因为你正在更新局部变量v并在执行setter后丢弃它。

您必须手动检查,然后自行升级属性更改事件,或者之后将v分配给_wcfObject.SomeProperty

public string SomeProperty
{
    get { return _wcfObject.SomeProperty; }
    set { 
            var v = _wcfObject.SomeProperty;
            Set(nameof(SomeProperty), ref v, value);
            _wcfObject.SomeProperty = v;
        }
}

看起来很漂亮......“很奇怪”。最好的可能是使用适当的支持字段,无论如何在包裹它们时直接操作模型是不好的做法,因为你不能丢弃这些改变。

private string someField;
public string SomeProperty
{
    get { return someField; }
    set { 
        Set(nameof(SomeProperty), ref someField, value);
    }
}

public ICommand DoSomethingCommand 
{
    return new DelegateCommand(DoSomething);
}

private void DoSomething()
{
    // apply your ViewModel state to the _wcfObject and do something with it
}

然后您的_wcfObject不受用户所做的更改的影响,直到他发起操作/命令。