2010-08-16 10 views
7

Desidero dichiarare un DataContext tramite una risorsa statica in XAML come associazione per i clienti nel database Northwind. Posso farlo facilmente in codice (C#) ma voglio imparare come fare in XAML. Ho provato tutti gli esempi che riesco a trovare ma nessuno di loro funziona per me. Credo che il problema sia nelle due righe di codice XAML che ho etichettato [Opzione1] e [Opzione2]. Puoi chiarire quale dovrebbe essere la sintassi di questo?Come definire DataContext in XAML utilizzando 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> 

risposta

7

Se per evitare di complicare la questione con Enti quadro e database MSSQL NorthWind, allora il buon esempio è fornito in Example2 codice di esempio di CodeProject "WPF/MVVM Quick Start Tutorial"

F o il vostro XAML si dovrebbe cambiare l'inizio di esso per:

<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> 

Un'altra variante di questo approccio può essere visto in "What is the advantage of setting DataContext in code instead of XAML?", la parte:

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

Migrazione DataContext definizione da codebehind a XAML non è correlato al l'uso di StaticResource o DynamicResource. Vedi: What's the difference between StaticResource and DynamicResource in WPF? probabilmente meglio affrontati nel CodeProject WPF: StaticResource vs. DynamicResource

correlate, disponibile e ulteriori letture:

1

preferisco impostare la chiave come stringa statica - WPF ha un numero sufficiente di corde magiche senza incappare in un angolo di refactoring se si può facilmente evitarlo.

in 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}"/> 

in App.xaml.cs

public static readonly string MainVmResourceKey = "MainVm"; 

nel mio varie Control.xaml

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

nota la parte UserControl è qualsiasi tipo che si desidera applicare il ViewModel a.

Problemi correlati