2010-08-16 16 views
7

Quiero declarar un DataContext a través de un recurso estático en XAML como un enlace para los Clientes en la base de datos Northwind. Puedo hacer esto fácilmente en el código (C#) pero quiero aprender a hacer en XAML. He intentado con todos los ejemplos que puedo encontrar, pero ninguno funciona para mí. Creo que el problema está en las dos líneas de código XAML que he etiquetado [Opción1] y [Opción2]. ¿Puedes aclarar cuál debería ser la sintaxis para esto?Cómo definir DataContext en XAML utilizando StaticResource

C#

namespace DataGridEF 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      bModel1 bNorthWind = new bModel1(); 
      //this.DataContext = bNorthWind; 
      bNorthWind.GetCustomers(); 
     } 
    } 
} 

namespace DataGridEF 
{ 
    public class bModel1 
    { 
     List<Customer> _Customers; 
     public List<Customer> Customers 
     { 
      get { return _Customers; } 
      set { _Customers = value; } 
     } 

     public void GetCustomers() 
     { 
      NorthwindEntities NorthWind = new NorthwindEntities(); 
      var CustomerQ = from cust in NorthWind.Customers select cust; 
      _Customers = CustomerQ.ToList(); 
     } 

    } 
} 

XAML

<Window x:Class="DataGridEF.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    xmlns:vm="clr-namespace:DataGridEF"> 

<Window.Resources> 
    <vm:bModel1 x:Key="TheViewModel" /> 
</Window.Resources> 

<Grid> 
    <DataGrid AutoGenerateColumns="False" Height="195" 
       HorizontalAlignment="Left" Margin="20,89,0,0" 
       Name="dataGrid1" ItemsSource="{Binding Path=Customers}" 
       [option1]DataContext="{StaticResource TheViewModel}" 
       [option2]DataContext= 
        "{Binding Path=., Source={StaticResource TheViewModel}}" 
       VerticalAlignment="Top" Width="471" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Path=ContactName}" /> 
      <DataGridTextColumn Header="Address" Binding="{Binding Path=Address}" /> 
      <DataGridTextColumn Header="City" Binding="{Binding Path=City}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
</Window> 

Respuesta

7

Si no complicar la cuestión con el Marco de Entidades y base de datos MSSQL NorthWind entonces el buen ejemplo se proporciona en Ejemplo 2 código de ejemplo de CodeProject "WPF/MVVM Quick Start Tutorial"

F o su XAML debe cambiar el inicio de la misma a:

<Window x:Class="DataGridEF.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    xmlns:vm="clr-namespace:DataGridEF"> 

<Window.DataContext> 
     <vm:bNorthWind /> 
    </Window.DataContext> 
<Grid> 
<!---Couldnt check your code due to dependencies on 
    EF and MSSQL NorthWind database 

    See the reference for working illustration sample: 
http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial 

--> 
</Grid> 
</Window> 

Otra variación de este enfoque se puede ver en "What is the advantage of setting DataContext in code instead of XAML?", la parte:

<StackPanel.DataContext> 
     <local:CustomerViewModel /> 
    </StackPanel.DataContext> 

Migración DataContext definición de código subyacente a XAML no está relacionada con el uso de StaticResource o DynamicResource. Ver: What's the difference between StaticResource and DynamicResource in WPF? probablemente mejor abordados en CodeProject WPF: StaticResource vs. DynamicResource

relacionada, servicial y lectura adicional:

1

prefiero para establecer la clave como una cadena estática - WPF tiene suficientes cuerdas mágicas sin arrinconarse en una esquina de refactorización si puede evitarla fácilmente.

en App.xaml

xmlns:viewModels="clr-namespace:MyAppNamespace.ViewModels" 
xmlns:local="clr-namespace:tvCADdesktop" 
x:Name="App" 
... 
<viewModels:ApplicationViewModel x:Key= "{x:Static local:App.MainVmResourceKey}"/> 

en App.xaml.cs

public static readonly string MainVmResourceKey = "MainVm"; 

en mi diversos Control.xaml

<UserControl.DataContext> 
    <Binding> 
     <Binding.Source> 
      <StaticResource ResourceKey="{x:Static app:App.MainVmResourceKey}" /> 
     </Binding.Source> 
    </Binding> 
</UserControl.DataContext> 

nota la parte UserControl es cualquier tipo que desea aplicar el modelo de vista a.

Cuestiones relacionadas