在 WPF 中定义 DataContext 似乎有两种主要方法:
- 在这样的代码中:
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();
}
}
- 或者像这样在 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>
在 XAML 中定义 DataContext 的一个优点是您的数据显示在 Expression Blend 设计模式中,Expression Blend 允许您在 GUI 中做很多事情,例如从数据源中选择字段等,如此处所示。
我已经读过绑定ADO.NET 对象不能在 XAML 中绑定(尽管我不明白为什么您可以为它们编写一个可以从 XAML 绑定的最小包装器)。
奇怪的是,WPF 团队在制作 WPF MVVM 模板时在代码中定义了 DataContext,这很快就使得在 Expression Blend 中编辑视图变得不切实际,因为您的数据不会显示在设计模式中,而设计模式通常是布局的重要组成部分.
所以我认为在代码中而不是 XAML 中设置 DataContext肯定有一些优势,有人知道它是什么吗?