2010-08-16 5 views
7

Je souhaite déclarer un DataContext via une ressource statique dans XAML en tant que liaison pour les clients de la base de données Northwind. Je peux le faire facilement en code (C#) mais je veux apprendre à faire en XAML. J'ai essayé tous les exemples que je peux trouver mais aucun d'eux ne fonctionne pour moi. Je crois que le problème est dans les deux lignes de code XAML que j'ai intitulées [Option1] et [Option2]. Pouvez-vous préciser quelle devrait être la syntaxe pour cela?Comment définir DataContext en XAML à l'aide de 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> 

Répondre

7

Si pour ne pas compliquer la question avec le cadre des entités et base de données MSSQL Northwind, la bonne illustration est fournie dans le code exemple Example2 de CodeProject "WPF/MVVM Quick Start Tutorial"

F ou votre XAML vous devez modifier le début de celui-ci à:

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

Une autre variante de cette approche peut être vu dans "What is the advantage of setting DataContext in code instead of XAML?", la partie:

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

Migration DataContext définition de codebehind à XAML est sans rapport avec l'utilisation de StaticResource ou DynamicResource. Voir: What's the difference between StaticResource and DynamicResource in WPF? probablement mieux traités dans CodeProject WPF: StaticResource vs. DynamicResource

connexes, lecture utile et plus:

1

je préfère définir la clé comme une chaîne statique - WPF a assez de cordes magiques sans vous coincer dans un coin refactoring si vous pouvez facilement l'éviter.

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

dans App.xaml.cs

public static readonly string MainVmResourceKey = "MainVm"; 

dans mes divers Control.xaml

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

note la partie UserControl est tout type que vous souhaitez appliquer le ViewModel à.

Questions connexes