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?
Comment peut-on dire à partir de ce XAML la source à laquelle ces propriétés sont liées? – Jay
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. –