2010-01-27 18 views
6

में आइटमसोर्स सेट करना चूंकि यह WPF है, यह बहुत सारे कोड की तरह दिख सकता है, लेकिन डरो मत, सवाल वास्तव में सरल है! अगर मैं बयान Hello.ItemSource = AllRoles बाहर टिप्पणी की, ग्रिड दिखाता कुछ भी नहीं छोड़WPF: XAML बनाम कोड -12

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

: मैं इस कोड-पीछे है

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

:

मैं निम्नलिखित XAML है। जब मैं इसे वापस रखता हूं, तो यह सही चीज़ प्रदर्शित करता है। ऐसा क्यों है?

उत्तर

15

यह:

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

"संपत्ति से आबद्ध ItemsSourcethis.DataContext.AllRoles" का अर्थ है जहां this वर्तमान तत्व है।

Hello.ItemsSource = AllRoles; 

, जो सीधे क्या करता है आप मूल रूप से करने के लिए कोशिश कर रहे थे "एक ObservableCollection<T> भूमिकाओं का पूरा करने के लिए बाध्य ItemsSource" का अर्थ है।

xaml में ऐसा करने के कई तरीके हैं। यहाँ एक है:

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

और XAML में

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

या वैकल्पिक रूप आप 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; 
    } 
} 

कर सकता है और उसके बाद के लिए एक RelativeSource का उपयोग खिड़की पर तार्किक पेड़ को चलने के लिए बाध्यकारी बताएं

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

जिसका अर्थ है "जब तक आपको कोई विंडो नहीं मिल जाती तब तक मेरे पूर्वजों को देखें, फिर ऑलरोल नामक विंडो पर सार्वजनिक संपत्ति की तलाश करें"।

लेकिन ऐसा करने का सबसे अच्छा तरीका है फ्रिजिंग कोडबेइंड को पूरी तरह से छोड़ना और MVVM pattern. का उपयोग करना मैं सुझाव दूंगा कि आप सीख रहे हैं कि आप सीधे एमवीवीएम पैटर्न पर जाते हैं। सीखने की अवस्था खड़ी है, लेकिन आप बाध्यकारी और आज्ञाओं और WPF के बारे में महत्वपूर्ण, शांत चीजों के बारे में सब कुछ सीखते हैं।

0

जब आप WPF में डेटास्रोत से जुड़ते हैं, तो यह आपके विंडो के डेटा संदर्भ की संपत्ति की तलाश में है जिसे "ऑलरोल्स" कहा जाता है। Xaml में डेटा बाइंडिंग पर अधिक के लिए मॉडल-व्यू-व्यू मॉडेल पैटर्न देखें। http://msdn.microsoft.com/en-us/magazine/dd419663.aspx