2010-08-16 16 views
7

Northwind veritabanındaki Müşteriler için bir bağ olarak XAML'deki bir statik kaynak aracılığıyla bir DataContext bildirmek istiyorum. Bunu kod (C#) ile kolayca yapabilirim ama XAML'de nasıl yapılacağını öğrenmek istiyorum. Bulduğum bütün örnekleri denedim ama hiçbiri benim için çalışmıyor. Sorunun, [Option1] ve [Option2] etiketli iki XAML kod satırında olduğuna inanıyorum. Bunun için sözdiziminin ne olduğunu açıklayabilir misiniz?StaticResource kullanarak XAML içinde DataContext nasıl tanımlanır

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(); 
     } 

    } 
} 

Varlıkları Framework ve MSSQL NorthWind veritabanı ile soru zorlaştıran önlemek için, o zaman iyi illüstrasyon CodeProject ait Örnek2 örnek kod verilmiştir 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> 

cevap

7

"WPF/MVVM Quick Start Tutorial"

F

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

XAML codebehind dan DataContext tanımını Geçirme ilgisi yoktur:

Bu yaklaşımın bir başka varyasyonu "What is the advantage of setting DataContext in code instead of XAML?" görülebilir
<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> 

, kısmen: veya XAML size bunun başlangıcını değişmelidir StaticResource veya DynamicResource'un kullanımı. Bkz: What's the difference between StaticResource and DynamicResource in WPF? muhtemelen daha iyi CodeProject ele WPF: StaticResource vs. DynamicResource

İlgili, yararlı ve daha fazla okuma:

1

ben statik dize olarak anahtar ayarlamayı tercih - WPF vardır Kolayca önleyebiliyorsanız, kendinizi bir dolandırıcı köşeye döndürmeden yeterli sihirli dizeler. Benim çeşitli Control.xaml

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

notta

public static readonly string MainVmResourceKey = "MainVm"; 

App.xaml.cs yılında 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}"/> 

yılında

UserControl kısmı ViewModel uygulamak istediğiniz ne olursa olsun türüdür.

İlgili konular