[英]ViewModel and Model and observing changes
应该将ViewModel与其他ViewModel关联并与其交互,还是应该只允许与Models交互? 还是两者兼而有之?
我会尝试使用代码更明确:
这个代码可以吗?
public class MainViewModel
{
public MainViewModel(IPeopleService service)
{
var people = service.GetPeople();
People = new ObservableCollection<PersonViewModel>(people.Select(p => new PersonViewModel(p)));
}
public ObservableCollection<PersonViewModel> People { get; set; }
public PersonViewModel SelectedPerson { get; set; }
}
您会看到SelectedPerson是ViewModel,而不是Model。
ViewModel可以与其他ViewModel进行交互,但不能与您进行交互。 在您的场景中,MainViewModel依赖于PersonViewModel。 这是错误的方法,应该是Person模型。
如果要与ViewModels交互并在它们之间传输数据,则应使用调解器模式。 许多流行的MVVM框架都具有此功能,称为Messenger服务。
编辑:这是示例代码。 我通常使用MVVM Light,但是您可以使用任何您想要的东西。
public class MainViewModel
{
public MainViewModel(IPeopleService service)
{
var people = service.GetPeople();
People = new ObservableCollection<Person>(people.Select(p => new Person(p)));
}
public ObservableCollection<Person> People { get; set; }
private Person _person;
public Person SelectedPerson
{
get
{
return _person;
}
set
{
if(value != null)
{
_person = value;
OnPropertyChanged("SelectedPerson");
//Send selected person on each change
Messenger.Default.Send<Person>(_person);
}
}
}
}
在您的PersonViewModel中,您应该注册消息类型的Person:
public class PersonViewModel
{
private Person _person;
public Person SelectedPerson
{
get
{
return _person;
}
set
{
if (value != null)
{
_person = value;
OnPropertyChanged("SelectedPerson");
}
}
}
public PersonViewModel()
{
Messenger.Default.Register<Person>(this, (p) =>
{
SelectedPerson = p;
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.