Обычно я использую DataTemplates
для связывания View
с Model
или ViewModel
Единственное место, где программный код моего View когда-либо ссылается на Model или ViewModel, находится при запуске, когда он устанавливает начальную ViewModel в качестве стартового View DataContext
. Все остальное подключено DataTemplates
(или DataTemplateSelectors
для Silverlight).
(На самом деле, чтобы быть справедливым, иногда мне нужно сделать что-то особенное, и я отдам объект DataContext
как ViewModel или Model в коде, но эти случаи редки, и я рассматриваю их как хаки)
Например, настройка запуска View / ViewModel:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var app = new ShellView();
var context = new ShellViewModel();
app.DataContext = context;
app.Show();
}
}
Вот пример некоторых шаблонов данных:
<Window.Resources>
<DataTemplate DataType="{x:Type local:SomeViewModel}">
<local:SomeViewForViewModel />
</DataTemplate>
<DataTemplate DataType="{x:Type local:SomeModel}">
<local:SomeViewForModel />
</DataTemplate>
</Window.Resources>
И, наконец, я буду использовать ContentControls
в своем XAML, где я хочу отобразить свои просмотры
<ContentControl Content="{Binding SomeViewModelProperty}" />
или
<ContentControl Content="{Binding SomeModelProperty}" />
Иногда ContentControls даже не нужны. Например, если вы связали ListView
с ObservableCollection<NodeModel>
, то каждый элемент в ListView
будет объектом типа NodeModel
, и WPF автоматически выберет DataTemplate для этого.
<ListView ItemsSource="{Binding Path=CollectionOfNodeModel}">
<ListView.Resources> <!-- Could also put this in Window.Resources -->
<DataTemplate DataType="{x:Type local:NodeModel}">
<local:Node /> <!-- DataContext will implicitly be the NodeModel object -->
</DataTemplate>
</ListView.Resources>
</ListView>
Идея, лежащая в основе MVVM, заключается в том, что все ваше приложение функционирует в ваших моделях ViewModel, а представления - это просто симпатичный пользовательский интерфейс, который расположен поверх моделей ViewModel, чтобы сделать их более удобными для пользователя. В идеальном мире View можно легко заменить любым другим пользовательским интерфейсом
.
Если вам интересно, у меня есть простой пример MVVM в моем блоге, который содержит несколько примеров использования шаблона проектирования MVVM