WPF で DataContext を定義するには、主に 2 つの方法があるようです。
- 次のようなコードのいずれかで:
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 を定義する利点の 1 つは、データが Expression Blend デザイン モードで表示され、 Expression Blend を使用すると、ここに示すようにデータソースからフィールドを選択するなど、GUI 内で多くのことを実行できることです。
バインディングADO.NET オブジェクトを XAML にバインドできないことを読みました(ただし、XAML からバインドできる最小限のラッパーを記述できる理由はわかりません)。
WPF MVVM テンプレートを作成する際に WPF チームがコードで DataContext を定義するのは奇妙です。これにより、レイアウトの重要な部分であることが多いデザイン モードでデータが表示されないため、Expression Blend でビューを編集することがすぐに実行不可能になります。 .
したがって、XAML の代わりにコードで DataContext を設定することには、何らかの利点があるに違いないと考えています。