我想过渡到反应式视图模型/模型。
到目前为止,我已经使用了 3 个场景:
“ValueA”:一次只能从一个视图模型访问模型值,并且只能通过视图模型更改值
=> 模型中的简单属性,
PropertyChanged
视图模型中的转发属性“ValueB”:模型值从多个视图模型和/或其他来源的更改中访问
=> 模型中带有事件的属性,转发属性和从更改的事件到
PropertyChanged
视图模型中的转换“ValueC”:仅在视图模型中使用的值
=> 模型中没有属性,属性由
PropertyChanged
视图模型中的自己的字段支持
这是我的“当前”方法:
class Model
{
public string ValueA {get;set;}
private string valueB;
public event ValueBChangedEvent ValueBChanged;
public string ValueB
{
get
{
return valueB;
}
set
{
valueB = value;
ValueBChanged();
}
}
}
class ViewModel : INotifyPropertyChanged
{
private Model model;
public string ValueA
{
get
{
return model.ValueA;
}
set
{
model.ValueA = value;
OnPropertyChanged();
}
}
ViewModel()
{
model.ValueBChanged += model_ValueBChanged;
}
private void model_ValueBChanged()
{
OnPropertyChanged("ValueB");
}
public string ValueB
{
get
{
return model.ValueB;
}
set
{
model.ValueB = value;
// no change notification since done via model
}
}
private string valueC;
public string ValueC
{
get
{
return valueC;
}
set
{
valueC = value;
OnPropertyChanged();
}
}
}
这就是我打算使用响应式扩展对它们进行建模的方式:
class ReactiveModel
{
public string ValueA {get;set;}
private ISubject<string> valueB = new Subject<string>();
public ISubject<string> ValueB
{
get
{
return valueB;
}
}
}
class ReactiveViewModel : INotifyPropertyChanged
{
private ReactiveModel model;
public string ValueA
{
get
{
return ???;
}
set
{
???
}
}
private ReactiveProperty<string> valueB = model.valueB.ToReactiveProperty();
public Reactive<string> ValueB
{
get
{
return valueB;
}
// no setter since access via ValueB.Value which is read-write
}
private ISubject<string> _valueC = new Subject<string>();
private ReactiveProperty<string> valueC = _valueC.ToReactiveProperty();
public ReactiveProperty<string> ValueC
{
get
{
return valueC;
}
// no setter since access via ValueC.Value which is read-write
}
}
概括:
- “ValueA”:我对这个案子一无所知
- “ValueB”:乍一看有效,但既不会将更改从视图模型传播到模型,也不会以其他方式传播。
- “ValueC”:按预期工作
如果我有 ValueA 和 ValueB 的解决方案,我会很高兴。