2010-09-02 17 views
5

में बाध्यकारी मैंListBox.ItemsSource कोड में और XAML

public ObservableCollection<string> Names … 
public Window1() 
{ 
    PutInDataIntoNames(); 
    InitializeComponent(); 
    this.listBox1.ItemsSource = Names; 
} 

की तरह और XAML में

<Grid> 
    <ListBox Margin="10,11,10,16" 
     Name="listBox1" 
     Background="Black" 
     Foreground="Orange" 
     /> 
</Grid> 

तब मैं XAML में ItemsSource गुण सेट करना चाहता था सरल कोड लिखा था। ऐसा करने के लिए मैंने निम्नलिखित लिखा:

ItemsSource="{Binding Path=Names}" 

दुर्भाग्यवश, यह काम नहीं करता है। क्या आप समझा सकते हैं कि यह सही क्यों और कैसे करें?

उत्तर

3

पीछे

public Window1() 
{ 
    PutInDataIntoNames(); 
    InitializeComponent(); 
    DataContext = this; 
} 

और में XAML

<Grid> 
    <ListBox ItemsSource="{Binding Names}" 
     Margin="10,11,10,16" 
     Name="listBox1" 
     Background="Black" 
     Foreground="Orange" 
     /> 
</Grid> 

कोड में ऐसा करें आदर्श रूप में आप MVVM डिजाइन का पालन करना चाहिए के पीछे कोड से डेटा को अलग करने की।

+0

ठीक है। लेकिन मैं तरह XAML में यह लिखने के लिए पसंद करेंगे <स्थानीय: ViewModel /> यह अक्सर कभी कभी मैं जरूरत dont't कि स्पष्ट रूप से DataContext स्थापित करने के लिए एक सा निराशाजनक है जबकि कभी-कभी मुझे चाहिए। –

8

यदि आप केवल बाध्यकारी पथ निर्दिष्ट करते हैं तो बाध्यकारी इंजन वर्तमान DataContext से शुरू होने वाले पथ पर नेविगेट करने का प्रयास करेगा, इसलिए ItemsSource="{Binding Path=Names}" इस तरह काम नहीं करता है, विशेष रूप से अधिक जटिल चीजें करते समय ध्यान में रखने के लिए कई अलग-अलग चीजें हैं ।

सबसे महत्वपूर्ण लेख जो कोई DataBinding के लिए नए पढ़ना चाहिए है अगर आप आपको लगता है कि रूप में अच्छी तरह, आप बस कर सकते हैं XAML में पूरी तरह से करना चाहते हैं Data Binding Overview on MSDN

अपने बंधन को वापस पाने के लिए, यह है कि खिड़की को अपने स्रोत को किसी भी तरह से संदर्भित करने की आवश्यकता है, या तो इसे सीधे या अपेक्षाकृत संदर्भित करके या डेटाकॉन्टेक्स्ट के रूप में सेट करके।

1 - डायरेक्ट संदर्भ:

<Window Name="Window" 
     ...> 
    <Grid> 
      <ListBox ... 
        ItemsSource="{Binding ElementName=Window, Path=Names}" 
        .../> 
    </Grid> 
</Window> 

2 - सापेक्ष संदर्भ

<Grid> 
      <ListBox ... 
        ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Names}" 
        .../> 
    </Grid> 

3 - DataContext

<Window ... 
     DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"> 
    <Grid> 
      <ListBox ... 
        ItemsSource="{Binding Path=Names}" 
        .../> 
    </Grid> 
</Window> 
3

की स्थापना ऐसा लगता है कि आपके Names एक क्षेत्र हो सकता है। आप केवल सार्वजनिक संपत्तियों से जुड़ सकते हैं