ViewModels应该与其他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。
答案 0 :(得分:0)
ViewModel可以与其他视图模型进行交互,但不是您的方式。在您的scenerio中,MainViewModel依赖于PersonViewModel。这是错误的方法,它应该是人物模型。
如果要与ViewModel交互并在它们之间传输数据,则应使用mediator模式。许多流行的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;
});
}
}