2013-08-26 2 views
1

Пожалуйста, помогите мне понять. У меня есть вид PanoramaPage.xaml с двумя PanoramaItem. Первый элемент - это список новостей из какой-либо веб-службы, второй элемент - список пользователей службы. Новости и пользователи отличаются Models.Multiple binding ViewModel для просмотра MVVM

Вид:

<controls:PanoramaItem Header="users"> 
       <ListBox Margin="0,0,-12,0"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal" Margin="0,0,0,17">                
           <StackPanel Width="311">          
            <TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
            <TextBlock Text="{Binding Aboutself}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
           </StackPanel> 
          </StackPanel> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
      </controls:PanoramaItem> 
     </controls:Panorama> 

<controls:PanoramaItem Header="news">    
        <ListBox Margin="0,0,-12,0"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <StackPanel Margin="0,0,0,17" Width="432" Height="78"> 
            <TextBlock Text="{Binding Title}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
            <TextBlock Text="{Binding Content}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
           </StackPanel> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 
       </controls:PanoramaItem> 

Под MVVM я должен дваViewModel «S для два управления Новости ListBox и пользователей ListBox или одинViewModel для один XAMLPanoramaPage.xaml.

PanoramaPageViewModel

public class PanoramaPageViewModel : INotifyPropertyChanged 
    { 
     private ObservableCollection<User> userDataSource; 
     private ObservableCollection<News> newsDataSource; 

     public ObservableCollection<User> UserDataSource 
     { 
      get 
      { 
       if (this.userDataSource == null) 
       { 
        this.userDataSource = new ObservableCollection<User>(); 
       } 
       return this.userDataSource; 
      } 
     } 

     public ObservableCollection<News> NewsDataSource 
     { 
      get 
      { 
       if (this.newsDataSource == null) 
       { 
        this.newsDataSource = new ObservableCollection<News>(); 
       } 
       return this.newsDataSource; 
      } 
     } 

     // LoadUsers(), LoadNews(), etc 
    } 

ИЛИ

UsersViewModel

public class UsersViewModel : INotifyPropertyChanged 
     { 
      private ObservableCollection<User> userDataSource;   

      public ObservableCollection<User> UserDataSource 
      { 
       get 
       { 
        if (this.userDataSource == null) 
        { 
         this.userDataSource = new ObservableCollection<User>(); 
        } 
        return this.userDataSource; 
       } 
      } 
      //LoadUsers() etc 
     } 

NewsViewModel

public class NewsViewModel : INotifyPropertyChanged 
     { 
      private ObservableCollection<News> newsDataSource;   

      public ObservableCollection<News> NewsDataSource 
      { 
       get 
       { 
        if (this.newsDataSource == null) 
        { 
         this.newsDataSource = new ObservableCollection<News>(); 
        } 
        return this.newsDataSource; 
       } 
      } 
      //LoadNews() etc 
     } 

Как вы думаете?

ответ

3

Single ViewModel. Не каждый элемент управления имеет свою собственную модель представления. Вы устанавливаете ViewModel как DataContext для всего представления. Даже если вы идете с двумя режимами просмотра, вам понадобится родительская модель, которая будет содержать экземпляры этих двух режимов просмотра. Эта модель родительского представления будет представлять собой Datacontext для всего представления, а дочерние элементы управления установят свой datacontext в эти дочерние модели просмотра, поэтому вам также придется изменить свои привязки.

Но модель одного вида с одним видом - это то, что mvvm.

Thanks

+0

Thanks @nit! Убедительный ответ. – Alexandr