2014-11-02 78 views
0

ViewModels是否应与其他ViewModel相关联并与其交互或仅允许与模型交互?或者两者兼而有之?ViewModel和Model并观察变化

我会尽力使用代码更加明确:

这个代码可以使用吗?

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

ViewModel可以与其他视图模型进行交互,但不是您所做的。在你的scenerio中,MainViewModel依赖于PersonViewModel。这是错误的方法,它应该是Person模型。

如果您想与ViewModels交互并在它们之间传输数据,则应使用中介模式。许多流行的MVVM框架都有这种功能,它被称为信使服务。

编辑:这里是一个示例代码。我通常使用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,你应该消息类型的人的登记:

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; 
      }); 
    } 
} 
+0

OK,但他们(MVVM库/框架的作者)也说,这是容易滥用这一机制,所以我尽量避免它。但是,我认为你是对的。如果你不紧张的ViewModels可能会好得多。但是它如何改变我作为示例发布的代码?为了使它正确,我应该修改什么? – SuperJMN 2014-11-02 12:20:34

+1

我编辑了我的答案。除此之外,您可以将选定的人员实例作为导航参数传递到您要导航的页面。 – 2014-11-02 13:25:05