Parece que hay dos formas principales para definir DataContext en WPF:¿Cuál es la ventaja de establecer DataContext en código en lugar de XAML?
- ya sea en el código así:
App.xaml.cs (tomado de la 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's DataContext
MainView mainView = new MainView();
MainViewModel mainViewModel = new MainViewModel();
mainViewModel.LoadCustomers("c:\\testdata2\\Customers.xml");
mainView.DataContext = mainViewModel;
mainView.Show();
}
}
- o en XAML así:
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>
Una ventaja de que la definición de la DataContext en XAML tiene es que sus datos aparece en el modo de diseño de Expression Blend y Expression Blend le permite hacer mucho dentro de la GUI, por ejemplo elija campos de su fuente de datos, etc. as shown here.
He leído que los objetos vinculados ADO.NET no pueden vincularse en XAML (aunque no veo por qué podría escribir un contenedor mínimo para ellos al que pueda vincular desde XAML).
extraño que el equipo de WPF en la fabricación de las plantillas de WPF MVVM definir el DataContext en el código, que muy rápidamente hace que sea imposible para editar sus vistas en Expression Blend, ya que sus datos no aparece en el modo de diseño que es a menudo una parte significativa del diseño.
Así que estoy pensando que debe ser una ventaja en el camino a la configuración de DataContext en el código en lugar de XAML, ¿alguien sabe lo que es?
¿Hay una mejor solución de ambos mundos para esto? ¿Esto significa que si utiliza la Biblioteca de aplicaciones compuestas/Unity que básicamente puede cortar y pegar de Expression Blend o hay una manera simple de, p. ¿se han burlado DataContexts por defecto en XAML que los diseñadores pueden usar en Blend? –
Bloody good question mate. –
ver mi respuesta en el DataobjectProvider. Se podría usar como fachada para delegar la creación de instancias y usar algo proveniente de DI. –