我的视图模型绑定到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?
答案 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
不受用户所做的更改的影响,直到他发起操作/命令。