2010-01-27 15 views
6

Bu WPF olduğundan, çok fazla kod gibi görünebilir, ancak korkmayın, soru gerçekten basittir! Ben dışarı yorumladı açıklamada Hello.ItemSource = AllRoles, ızgara şey görüntüler bırakırsanızWPF: XAML'ye karşılık CodeSource öğesinin ayarlanması Code-behind

using System.Collections.ObjectModel; 
using System.Windows; 

namespace hax 
{ 

    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 

     public ObservableCollection<Role> AllRoles { get { return m_AllRoles; } set { m_AllRoles = value; } } 
     private ObservableCollection<Role> m_AllRoles = new ObservableCollection<Role>(); 

     public MainWindow() 
     { 
      this.InitializeComponent(); 

      AllRoles.Add(new Role("John", "Manager")); 
      AllRoles.Add(new Role("Anne", "Trainee")); 
      // Hello.ItemsSource = AllRoles; // NOTE THIS ONE! 
     } 
    } 
} 

: Bu kodu-arkasında olması

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:hax="clr-namespace:hax" x:Class="hax.MainWindow" 
    x:Name="Window" Title="Haxalot" Width="640" Height="280"> 

    <Grid x:Name="LayoutRoot"> 
     <ListView ItemsSource="{Binding AllRoles}" Name="Hello"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Name" 
         DisplayMemberBinding="{Binding Path=FullName}"/> 
        <GridViewColumn Header="Role" 
         DisplayMemberBinding="{Binding Path=RoleDescription}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</Window> 

:

Aşağıdaki XAML var. Onu tekrar yerleştirdiğimde, doğru olanı gösterir. Bu neden?

cevap

15

Bu:

<ListView ItemsSource="{Binding AllRoles}" Name="Hello"> 

"özelliğine Bind ItemsSource this.DataContext.AllRoles" anlamına this akım eleman yerdir.

Hello.ItemsSource = AllRoles; 

doğrudan başlangıçta yapmaya çalıştıkları şey yapar "rollerin tam bir ObservableCollection<T> için Cilt ItemsSource" anlamına gelir.

Bunu xaml'de yapmanın birkaç yolu vardır.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     this.InitializeComponent(); 
     var allRoles = new ObservableCollection<Role>() 
     allRoles.Add(new Role("John", "Manager")); 
     allRoles.Add(new Role("Anne", "Trainee")); 
     this.DataContext = allRoles; 
    } 
} 

ve xaml

alternatif
<ListView ItemsSource="{Binding}" Name="Hello"> 

YA, sen AllRoles

public partial class MainWindow : Window 
{ 
    public ObservableCollection<Role> AllRoles {get;private set;} 
    public MainWindow() 
    { 
     this.InitializeComponent(); 
     var allRoles = new ObservableCollection<Role>() 
     allRoles.Add(new Role("John", "Manager")); 
     allRoles.Add(new Role("Anne", "Trainee")); 
     this.AllRoles = allRoles; 
    } 
} 

pencerenin bir ortak özelliği yapmak ve sonra bir RelativeSource kullanabilirsiniz: Burada biri Bağlama işleminin Mantıksal Ağacın Pencereye

<ListView 
    ItemsSource="{Binding AllRoles, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 
    Name="Hello"> 

Bu, "Bir Pencere bulana kadar atalarıma bak, sonra AllRoles adlı pencere üzerinde bir ortak özellik ara" anlamına gelir.

Ancak bunu yapmanın en iyi yolu, frigging codebehind öğesinin tümünü atlamak ve MVVM pattern. kullanmaktır. Doğrudan MVVM desenine atladığınızı öğreniyorsanız bunu öneririm. Öğrenme eğrisi dik, ancak WPF ile ilgili her şeyi ve komutları ve önemli, güzel şeyleri öğreniyorsunuz.

İlgili konular