2010-09-14 5 views
1

aujourd'hui, j'examinted WAP CodePlex un peu et vu ceci:WPF Application framework lie le modèle?

BookListView.xaml:

<ListView ItemsSource="{Binding Books}" SelectedItem="{Binding SelectedBook}" 
        SelectionChanged="ListViewSelectionChanged"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn DisplayMemberBinding="{Binding Title}" Header="{x:Static p:Resources.Title}" Width="250"/> 
        <GridViewColumn DisplayMemberBinding="{Binding Author}" Header="{x:Static p:Resources.Author}" Width="150"/> 
        <GridViewColumn DisplayMemberBinding="{Binding PublishDate, StringFormat=d}" Header="{x:Static p:Resources.PublishDate}" Width="100"/> 
       </GridView> 
      </ListView.View> 

MISE À JOUR:

[Export(typeof(IBookListView))] 
    public partial class BookListView : UserControl, IBookListView 
     { 
      public BookListView() 
      { 
      InitializeComponent(); 
     } 


     private BookListViewModel ViewModel { get { return DataContext as BookListViewModel; } } 


     private void ListViewSelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      foreach (Book book in e.RemovedItems) 
      { 
       ViewModel.SelectedBooks.Remove(book); 
      } 
      foreach (Book book in e.AddedItems) 
      { 
       ViewModel.SelectedBooks.Add(book); 
      } 
     } 
    } 

public class BookListViewModel : ViewModel<IBookListView> 
    { 
     private readonly IEnumerable<Book> books; 
     private readonly ObservableCollection<Book> selectedBooks; 
     private Book selectedBook; 
     private ICommand addNewCommand; 
     private ICommand removeCommand; 


     public BookListViewModel(IBookListView view, IEnumerable<Book> books) 
      : base(view) 
     { 
      if (books == null) { throw new ArgumentNullException("books"); } 

      this.books = books; 
      this.selectedBooks = new ObservableCollection<Book>(); 
     } 


     public IEnumerable<Book> Books { get { return books; } } 

     public ObservableCollection<Book> SelectedBooks 
     { 
      get { return selectedBooks; } 
     } 

     public Book SelectedBook 
     { 
      get { return selectedBook; } 
      set 
      { 
       if (selectedBook != value) 
       { 
        selectedBook = value; 
        RaisePropertyChanged("SelectedBook"); 
       } 
      } 
     } 

     public ICommand AddNewCommand 
     { 
      get { return addNewCommand; } 
      set 
      { 
       if (addNewCommand != value) 
       { 
        addNewCommand = value; 
        RaisePropertyChanged("AddNewCommand"); 
       } 
      } 
     } 

     public ICommand RemoveCommand 
     { 
      get { return removeCommand; } 
      set 
      { 
       if (removeCommand != value) 
       { 
        removeCommand = value; 
        RaisePropertyChanged("RemoveCommand"); 
       } 
      } 
     } 
    } 

controlleur: Ici, les livres sont extraits de Entity Framework/database

public void Initialize() 
     { 
      bookViewModel.LendToCommand = lendToCommand; 
      bookViewModel.PropertyChanged += BookViewModelPropertyChanged; 

      IBookListView bookListView = container.GetExportedValue<IBookListView>(); 
      bookListViewModel = new BookListViewModel(bookListView, entityService.Books); 
      bookListViewModel.AddNewCommand = addNewCommand; 
      bookListViewModel.RemoveCommand = removeCommand; 
      bookListViewModel.PropertyChanged += BookListViewModelPropertyChanged; 

      shellViewModel.BookListView = bookListViewModel.View; 
      shellViewModel.BookView = bookViewModel.View; 

      bookListViewModel.SelectedBook = bookListViewModel.Books.FirstOrDefault(); 
     } 

et exactement ces livres sont passés bookListViewModel = new BookListViewModel (bookListView, entityService.Books); au BookListViewModel qui est défini en tant que DataContext de la liaison BookListView.xaml aux livres.

J'ai été choqué !!! Ai-je raison de dire qu'ils se lient directement aux propriétés des modèles?

+0

Comment peut-on dire à partir de ce XAML la source à laquelle ces propriétés sont liées? – Jay

+0

Pourquoi si choqué? Bien que ce ne soit peut-être pas la meilleure approche architecturale, si je comprends bien, le WAF n'est pas censé être l'implémentation d'une application WPF. J'ai vu cette approche couramment utilisée pour les petites et moyennes applications et même pour certaines plus grandes. Tout est une question d'exigences. –

Répondre

1

Il est parfaitement légitime de lier directement au modèle via une propriété du ViewModel.

Vous n'auriez besoin de réimplémenter une propriété sur le ViewModel que si cela nécessitait un traitement pour la vue, sinon c'est votre choix.

Jetez un oeil à this pour la prise de Karl Shifflet sur MVVM couches d'application.

+0

Ils ne délèguent pas à la collection de livres qu'ils lient directement à lui! Chaque objet de modèle doit être enveloppé dans un modèle MVVM et ces livres sont une collection de type book, il doit donc y avoir un bookViewModel enveloppant un livre. Mais il n'y a rien. – Elisabeth

+0

Karl Shifflet prend MVVM pas si grave. Ce sont même ses mots pas littéralement bien sûr ... – Elisabeth

+0

au dessus tout ce code de WAF est une blague: passer des données de la vue au viewodel ??? Obtenir les livres sélectionnés peut facilement être fait avec un comportement SelectedItems lié au viewmodel. private void ListViewSelectionChanged (expéditeur d'objet, SelectionChangedEventArgs e) { foreach (Livre dans e.RemovedItems) { ViewModel.SelectedBooks.Remove (book); } foreach (Livre dans e.AddedItems) { ViewModel.SelectedBooks.Add (book); } } – Elisabeth