Существует два основных способа определения DataContext в WPF:
App.xaml.cs (взято из шаблона WPF MVVM Toolkit ):
public partial class App : Application
{
private void OnStartup(object sender, StartupEventArgs e)
{
// Create the ViewModel and expose it using the View's DataContext
MainView mainView = new MainView();
MainViewModel mainViewModel = new MainViewModel();
mainViewModel.LoadCustomers("c:\\testdata2\\Customers.xml");
mainView.DataContext = mainViewModel;
mainView.Show();
}
}
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 при создании шаблонов WPF MVVM определяет DataContext в коде , что очень быстро делает практически невозможным редактирование ваших представлений в Expression Blend, поскольку ваши данные не отображаются в режиме разработки что часто является значительной частью макета.
Так что я думаю, что должно быть какое-то преимущество на пути к установке DataContext в коде вместо XAML, кто-нибудь знает, что это такое?