2014-11-02 74 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