Кажется, существуют два основных способа определения DataContext в WPF:
- либо в коде, как это:
App.xaml.cs(взято из WPF MVVM Toolkit template):
public partial class App : Application
{
private void OnStartup(object sender, StartupEventArgs e)
{
// Create the ViewModel and expose it using the View DataContext
MainView mainView = new MainView();
MainViewModel mainViewModel = new MainViewModel();
mainViewModel.LoadCustomers("c:\\testdata2\\Customers.xml");
mainView.DataContext = mainViewModel;
mainView.Show();
}
}
- или в XAML следующим образом:
Window1.xaml:
<DockPanel>
<StackPanel
HorizontalAlignment="Left"
DockPanel.Dock="Top"
Orientation="Horizontal">
<StackPanel.DataContext>
<local:CustomerViewModel />
</StackPanel.DataContext>
<TextBlock Text="{Binding Path=FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding Path=LastName}" />
</StackPanel>
<StackPanel
HorizontalAlignment="Left"
VerticalAlignment="top"
DockPanel.Dock="Top"
Orientation="Horizontal">
<ListBox ItemsSource="{Binding Source={StaticResource FileNames}}" />
</StackPanel>
<StackPanel
HorizontalAlignment="Left"
VerticalAlignment="top"
DockPanel.Dock="Top"
Orientation="Horizontal">
<ComboBox
ItemsSource="{Binding Source={StaticResource Directories}}"
SelectedIndex="0" />
</StackPanel>
<StackPanel
HorizontalAlignment="Left"
VerticalAlignment="top"
DockPanel.Dock="Top"
Orientation="Horizontal">
<StackPanel.DataContext>
<local:SystemInformationViewModel />
</StackPanel.DataContext>
<TextBlock Text="{Binding Path=CurrentTime}" />
</StackPanel>
</DockPanel>
Одно из преимуществ, заключающееся в том, что определение DataContext в XAML состоит в том, что ваши данные отображаются в режиме разработки Expression Blend, а Expression Blend позволяет делать довольно много в графическом интерфейсе, например. выберите поля из источника данных и т.д. как показано здесь.
Я прочитал, что привязка объектов ADO.NET не может быть привязана к XAML (хотя я не понимаю, почему вы могли бы написать минимальную оболочку для них, с которой вы могли бы связываться с XAML).
Странно, что команда WPF при создании шаблонов MVVM WPF определяет DataContext в коде, что очень быстро делает невозможным редактировать ваши представления в Expression Blend, поскольку ваши данные не отображаются в дизайне режим, который часто является значительной частью макета.
Итак, я думаю, что должно быть какое-то преимущество по пути к установке DataContext в коде вместо XAML, кто-нибудь знает, что это такое?