2012-02-22 23 views
50

मैं स्ट्रिंग मानों की एक सूची सूची सूची में बांधने की कोशिश कर रहा हूं ताकि उनके मान लाइन से लाइन सूचीबद्ध हों। अभी मैं इस का उपयोग करें:मैं डब्ल्यूपीएफ/डब्ल्यूपी 7 में लिस्टबॉक्स में स्ट्रिंग्स की सूची कैसे जोड़ सकता हूं?

<ListBox Margin="20" ItemsSource="{Binding Path=PersonNames}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Id}"></TextBlock> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

लेकिन मैं नहीं जानता कि मैं क्या Id के बजाय, TextBlock में डाल करना चाहिए, क्योंकि वे सभी स्ट्रिंग मूल्यों, नहीं कस्टम वर्ग हैं।

यह भी शिकायत करता है कि मेनपेज के अंदर मेनपेज के रूप में, जब मैं मेनपेज के रूप में हूं, तो व्यक्तिगत नाम नहीं है। PersonNames।

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

मैं गलत कर रहा हूँ:

मैं करने के लिए डेटा संदर्भ सेट?

<TextBlock Text="{Binding}"></TextBlock> 

आप किसी भी वस्तु पर इस वाक्य विन्यास का उपयोग कर सकते हैं:

उत्तर

111

में वर्ग के नाम देखेंगे तो बस डाल कि आपके ItemsSource इस तरह ही है:

<ListBox Margin="20" Name="YourListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

अपडेट::

YourListBox.ItemsSource = new List<String> { "One", "Two", "Three" }; 

आपका XAML की तरह दिखना चाहिए

डेटाकॉन्टेक्स्ट का उपयोग करते समय यह एक समाधान है।

public class MyViewModel 
{ 
    public List<String> Items 
    { 
     get { return new List<String> { "One", "Two", "Three" }; } 
    } 
} 

//This can be done in the Loaded event of the page: 
DataContext = new MyViewModel(); 

आपका XAML अब इस तरह दिखता है:

<ListBox Margin="20" ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

इस दृष्टिकोण का लाभ यह है कि निम्नलिखित कोड viewmodel आप पृष्ठ के DataContext और DataContext की स्थापना करने के लिए गुजर रहा हो जाएगा आप MyViewModel क्लास में बहुत अधिक गुण या जटिल ऑब्जेक्ट्स डाल सकते हैं और उन्हें XAML में निकाल सकते हैं। उदाहरण के लिए व्यक्ति वस्तुओं की एक सूची पारित करने के लिए:

public class ViewModel 
{ 
    public List<Person> Items 
    { 
     get 
     { 
      return new List<Person> 
      { 
       new Person { Name = "P1", Age = 1 }, 
       new Person { Name = "P2", Age = 2 } 
      }; 
     } 
    } 
} 

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

और XAML:

<ListBox Margin="20" ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Name}" /> 
       <TextBlock Text="{Binding Path=Age}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

आशा इस मदद करता है!:)

+1

धन्यवाद, मैं आपके लिस्टबॉक्स द्वारा उलझन में हूं। क्या यह नियंत्रण का नाम है? क्या आपको xaml के काम के लिए कोड में पहली पंक्ति है? –

+1

वह एक टाइपो था, यह वास्तव में नियंत्रण का नाम है। आप अपने पृष्ठ पर या संसाधनों के माध्यम से डेटा कॉन्टेक्स्ट के माध्यम से आइटम को भी बाध्य कर सकते हैं। मैंने जो बाध्यकारी दिया वह डेमो-प्रयोजनों के लिए था। :) – Abbas

+0

धन्यवाद, क्या आप मुझे डेटाकॉन्टेक्स्ट के लिए एक उदाहरण दे सकते हैं? मुझे समझने में मुश्किल हो रही है। –

8

तो आइटम स्रोत स्ट्रिंग-प्रविष्टियों के रूप में गणनीय है, तो निम्न का उपयोग करें। आम तौर पर, ToString() -method को मान प्राप्त करने के लिए बुलाया जाएगा। यह कई मामलों में बहुत आसान है। लेकिन सावधान रहें कि कोई बदलाव अधिसूचना नहीं होगी।

+0

धन्यवाद, मैं यह कोशिश करेंगे लेकिन मुझे अभी भी बाध्यकारी भाग के साथ कोई समस्या है जहां यह xaml में PersonNames नहीं ढूंढने की शिकायत करता है। –

+0

+1 संपादन और प्रदान करने के लिए +1-toString जानकारी – mindandmedia

+0

@ जोन वेंग: यह बाध्यकारी समस्या एक और समस्या है और एक टिप्पणी में तेजी से समझाया नहीं गया है। मुझे लगता है कि आपके UserControl या विंडो का DataContext व्यक्ति नाम-एक्सपोज़िंग इंस्टेंस पर सेट नहीं है। यदि इसे विंडो या उपयोगकर्ता नियंत्रण में घोषित किया गया है, तो आप बाध्यकारी {बाध्यकारी व्यक्ति नाम, सापेक्ष स्रोत = {सापेक्ष स्रोत मोड = FindAncestor, पूर्वज/प्रकार}}} में एक तेज़ समाधान के लिए जोड़ सकते हैं, जहां आपको "विंडो" को "UserControl" से बदलना होगा "अगर आपका लिस्टबॉक्स उपयोगकर्ता नियंत्रण में है। डेटाकॉन्टेक्स्ट और एमवीवीएम के बारे में कुछ पोस्ट देखें, इससे आपको डेटाकॉन्टेक्स्ट – HCL

10

आप हमें PersonNames के लिए कोड दिखाना चाहिए, और मुझे यकीन है कि नहीं हूँ, मैं आपके सवाल का समझते हैं, लेकिन हो सकता है आप इस तरह यह बाध्य करने के लिए चाहते हैं:

<TextBlock Text="{Binding Path=.}"/> 

या

<TextBlock Text="{Binding"} /> 

यह सूची में मौजूदा तत्व से बंधेगा। (व्यक्तिगत नाम मानना ​​तारों की एक सूची है)। अन्यथा, आप सूची

+3

को समझने में मदद मिलेगी 'पथ =।' दो-तरफा बाइंडिंग के लिए आवश्यक है – Dani

1

आप अपने लिस्टबॉक्स के हिस्से के रूप में टेक्स्टब्लॉक नियंत्रण को स्पष्ट रूप से परिभाषित किए बिना ऐसा कर सकते हैं (जब तक कि आप बेहतर स्वरूपण नहीं चाहते)। ट्रिगर करने के लिए बाध्यकारी हो रही करने के लिए चाल ObservableCollection<string>List<string>

के बजाय Window1.xaml उपयोग कर रहा है

<ListView Width="250" Height="50" ItemsSource="{Binding MyListViewBinding}"/> 

Window1.xaml.cs

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

    // Need to initialize this, otherwise you get a null exception 
    MyListViewBinding = new ObservableCollection<string>(); 
} 

public ObservableCollection<string> MyListViewBinding { get; set; } 

// Add an item to the list   
private void Button_Click_Add(object sender, RoutedEventArgs e) 
{ 
    // Custom control for entering a single string 
    SingleEntryDialog _Dlg = new SingleEntryDialog(); 

    // OutputBox is a string property of the custom control 
    if ((bool)_Dlg.ShowDialog()) 
     MyListViewBinding.Add(_Dlg.OutputBox.Trim()); 
} 
संबंधित मुद्दे