2015-11-05 9 views
5

में चयनित इंडेक्स = "0" सेट नहीं कर सकता है मेरे पास 2 ListViews और टेक्स्टब्लॉक है। पहली सूची दृश्य 1 में वर्णमाला क्रम में अक्षर शामिल हैं। और दूसरी सूची दृश्य 2 में वे शब्द शामिल हैं जो चयनित पत्र (ListView1 में) से शुरू होते हैं। जब मैं ListView1 से एक पत्र चुनता हूं और फिर ListView2 में लोड किए गए शब्द पर क्लिक करता हूं, तो मैं इस शब्द की एक टेक्स्टब्लॉक में परिभाषा प्राप्त करना चाहता हूं।Xaml में ListView (Windows Store App)

<ListView 
       Width="510" 
       x:Name="ListView1" 
       ItemsSource="{Binding}" 
       Background="White" 
       Foreground="Black" 
       TabIndex="1" 
       Margin="-7,8,0,0" 
       IsSwipeEnabled="False" 

       SelectionChanged="ItemListView_SelectionChanged" 
       Grid.Row="1" 
       HorizontalAlignment="Left"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Grid.Row="0" 
          Text="{Binding glossary_letter}" 
      Margin="10,0,0,0" 
      TextWrapping="Wrap" 
          Foreground="Black" 
      FontSize="24" 
      FontWeight="SemiBold" 
      VerticalAlignment="Center"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
      <ListView Width="361" 
       x:Name="ListView2" 
       Background="White" 
       Foreground="Black" 
       Margin="425,8,230,0" 
       Grid.Row="1" 
       HorizontalAlignment="Center" 
       ItemsSource="{Binding}" 
       SelectionChanged="itemListView2_SelectionChanged"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Grid.Row="1" 
      TextWrapping="Wrap" 
          Foreground="Black" 
          Text="{Binding}"  
      FontSize="24" 
      FontWeight="SemiBold" 
      VerticalAlignment="Center"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
      <StackPanel HorizontalAlignment="Right" 
         Background="White" 
         Width="580" 
         Margin="0,10,0,0" Grid.Row="1" Grid.ColumnSpan="2"> 
       <TextBlock x:Name="defBlock" Foreground="Black" Text="{Binding glossary_definition}"></TextBlock> 
      </StackPanel> 

अगर मैं एक पत्र (ListView1) तो एक शब्द (ListView2) पर पर पहली बार क्लिक करें यह मुझे परिभाषा पता चलता है:

यह मेरा Xaml है।

private void ListView1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     {   
      ListView2.ItemsSource = arrayW[ListView1.SelectedIndex];   
     } 
    private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
    defBlock.Text = arrayDef[ListView1.SelectedIndex][ListView2.SelectedIndex];  
    } 

किसी भी विचार क्या है त्रुटि मैं कर रहा हूँ: हालांकि दूसरी बार मैं एक पत्र पर क्लिक करें, यह मुझे एक OutOfRange त्रुटि जहां ListView2.SelectedIndex = -1

यह मेरी सी # कोड है देता है?

+0

इस दूसरी है (आप वास्तव में List2 स्पष्ट करने की जरूरत नहीं है, यह स्वतः ही के रूप में डेटा स्रोत बदल गया है को मंजूरी दे दी है (क्षमा करें, मुझे लगता है कि स्पष्ट) नहीं किया) जब आप सूची 1 या एक ही पत्र पर क्लिक करते हैं? –

+0

यह दूसरी बार है जब मैं एक अलग पत्र पर क्लिक करता हूं। मुझे दी गई सही त्रुटि यह है: सूचकांक सरणी की सीमाओं के बाहर था। – yalematta

+0

कृपया इसे इस्तेमाल करने वाली विंडो के संस्करण और विशेष ऐप प्रकार के साथ टैग करें। धन्यवाद। –

उत्तर

2
private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

    if(ListView2.SelectedIndex >= 0){ 
     defBlock.Text = arrayDef[ListView1.SelectedIndex][ListView2.SelectedIndex];  
    } 
    else 
    { 
     defBlock.Text = arrayDef[ListView1.SelectedIndex][0];//set default selected word.. 
    } 
} 
+0

अच्छा जवाब, इसके लिए धन्यवाद। –

0

समस्या
आप अपने List2 चयनित सूचकांक प्रबंधन करने की आवश्यकता हैंडलर बदल गया है, हर बार के रूप में आप अपनी सूची में एक अद्यतन सूची 2 पर एक चयनित सूचकांक बदलाव नहीं आया है और वहाँ के रूप में कोई चयनित सूचकांक यह चूक है -1 ।

ऐसा करने के कई तरीके हैं।
1.

private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
    if(ListView2.SelectedIndex == -1) 
    // do something or 
    // eg. 
    return; 
    // or 
    throw new IndexOutOfRangeException("Message"); 
    //or 
    throw new Exception(); // catch all    
    } 

2.

मुझे यकीन है कि आप कैसे तरह देखने के लिए अपने app चाहते हैं नहीं कर रहा हूँ।

मैं इसके लिए दो अलग-अलग पृष्ठों का उपयोग करूँगा। और अपने पहले सूची दृश्य के लिए xaml है और फिर दूसरा पृष्ठ आपके पहले पृष्ठ के चयनित इंडेक्स को देखा और बाध्य किया गया है।

तो सूची 1, आप चुनते हैं और फिर एक नए पृष्ठ में डेटा स्रोत के रूप में सेट करना आसान है जो सूची 2 दिखाता है, और फिर आप किसी चयनित आइटम से विवरण के साथ अपना टेक्स्टबॉक्स अपडेट कर सकते हैं। या आगे, यदि आप शब्द और इसकी परिभाषा के अधिक व्यापक विवरण दिखाना चाहते हैं तो एक तीसरा पृष्ठ बनाएं।

इस तरह आपको डेटा सूची में बदलाव के रूप में कोई भी चयनित अनुक्रमणिका नहीं होने पर आपकी सूची 2 में कोई समस्या नहीं होगी।

3.
या, हैंडलर बदल इंडेक्स से बाहर बाध्यकारी घोषणाओं और उन्हें विधिपूर्वक फोन एक सूचकांक List1 में है जब selected.So जब List1 के चयन बदल जाता है, सूची 2 में अद्यतन किया जाता है दूसरे शब्दों में, आपको अपना डेटा स्रोत अपडेट करना होगा। संपादित करें: और इसके साथ डेटा आउटसोर्स अपडेट होने के कारण आउटफ्रेंज अपवाद से बचने के लिए त्रुटि प्रबंधन के उपयोग को नियंत्रित करने का यह एक और तरीका है।

तो संभवतः निम्नलिखित को एक अलग विधि में डालें।

private void MyTextMethod(){ 

    defBlock.Text = arrayDef[ListView1.SelectedIndex][ListView2.SelectedIndex]; 
} 

private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
    try{ 

     MyTextMethod)(); 
    } 
    catch(OutOfRangeException){ 
     // do something. 
    } 
} 
आपके चयनित इंडेक्स से बाहर

हैंडलर बदल गया है और एक अलग विधि के लिए एक फोन करना है जब हैंडलर के भीतर से।

4।

सूची 1 के लिए अपने चयनित इंडेक्स चेंज हैंडलर से सूची 2 के लिए अपनी बाध्यकारी घोषणा लें।

तो आपके पास एक तरीका हो सकता है जो सूची 2 के बाध्यकारी स्रोत को अपडेट करेगा और चयनित इंडेक्स को प्रबंधित हैंडलर प्रबंधित करेगा। हालांकि यह कम से कम उपयोगी सुझाव है।

नीचे पंक्ति: आपको कुछ प्रयास करने और पकड़ने की आवश्यकता है, या आउटफ्रेंज अपवाद का प्रबंधन करने के लिए कथन फेंकने की आवश्यकता है, क्योंकि दूसरी सूची में अलग-अलग लंबाई और पत्र पर सूचकांक होगा क्योंकि सूची 10 में चुनी जा सकती है, और फिर पत्र एक्स में केवल लंबाई 1 की एक सूची हो सकती है और चयन चयन का मुद्दा हमेशा -1 का चयन कर रहा है।

+0

मैंने एक विधि बनाई: 'सार्वजनिक शून्य FillWords() { ListView2.Items.Clear(); ListView2.ItemsSource = arrayW [ListView1.SelectedIndex]; } ' और मैंने इसे ListView1 के चयन चेंज किए गए ईवेंट हैंडलर से बुलाया। लेकिन मुझे 'ListView2.Items.Clear();' – yalematta

+0

पर "आपदाजनक विफलता" त्रुटि मिल रही है क्योंकि मेरे पास SelectionMode = SingleMode है, इसलिए मैं 'ListView2.Items.Clear(); का उपयोग नहीं कर सकता;' मैंने 'ListView2' का उपयोग किया। SelectedItem = null; 'लेकिन मुझे अभी भी पहली त्रुटि' आउटऑफेंज 'त्रुटि मिलती है जहां' ListView2.SelectedIndex = -1' – yalematta

+0

क्षमा करें, मुझे लगता है कि मेरा पहला जवाब स्पष्ट नहीं था। वह मेरी गलती है। मुझे उम्मीद है कि यह आपके लिए इसे साफ़ कर देगा। :) –