2012-12-29 12 views
7

मैं एक LongListSelector के भीतर एक ContextMenu का उपयोग कर रहा हूं ताकि मैं एलएलएस से जुड़ी सूची में कुछ आइटम हटा सकूं।ContextMenu का मेनू Item DataContext पुरानी वस्तुओं को वापस करता है

एलएलएस लागू करने के लिए मैं हाल ही में एक गाइड here का पालन कर रहा हूं (हालांकि मैं जंपलिस्ट का उपयोग नहीं कर रहा हूं)। एकमात्र चीज जो मैंने बदल दी है वह है कि बेस ग्रुप क्लास सूची के बजाय ऑब्जर्जेबल कोलेक्शन का विस्तार करे।

मेरे पास यह मुद्दा यह है कि एक बार जब मैंने ContextMenu लागू किया है और वहां से हटा दिया है, तो मैं दो बार दृश्य सूची में उसी "स्थान" से हटा सकता हूं और फिर यह क्रैश हो जाएगा। डिबगिंग से पता चलता है कि दूसरे डिलीट के बाद, MenuItem का डेटाकॉन्टेक्स्ट पिछले आइटम को हटा देता है जो हटा दिया गया था। तो जब मैं सूची में इसकी खोज करता हूं, तो मुझे प्राप्त सूचकांक -1 है। मैं इसे पकड़ सकता हूं लेकिन मुझे नहीं पता कि फिर आइटम के रूप में वास्तव में क्या चुना गया था।

मेरे XAML ContextMenu के लिए खंड के रूप में नीचे है:

<phone:LongListSelector.ItemTemplate> 
    <DataTemplate> 
     <Grid toolkit:TiltEffect.IsTiltEnabled="True"> 
      <toolkit:ContextMenuService.ContextMenu> 
       <toolkit:ContextMenu x:Name="conmen" Loaded="ContextMenu_Loaded"> 
         <toolkit:MenuItem Header="Delete" Click="DeleteItem_Click"/> 
       </toolkit:ContextMenu> 
      </toolkit:ContextMenuService.ContextMenu> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 

      <Border Grid.Column="0" Background="{StaticResource PhoneInverseBackgroundBrush}" Padding="{StaticResource PhoneTouchTargetOverhang}"> 
       <TextBlock Text="{Binding Usr, StringFormat='x{0}'}" FontSize="32" HorizontalAlignment="Left" Width="48"/> 
      </Border> 

      <Border Grid.Column="1" Background="{StaticResource PhoneInverseBackgroundBrush}" Padding="{StaticResource PhoneTouchTargetOverhang}"> 
       <TextBlock Text="{Binding Name}" FontSize="32" HorizontalAlignment="Left" /> 
      </Border> 

      <Border Grid.Column="2" Background="{StaticResource PhoneInverseBackgroundBrush}" Padding="{StaticResource PhoneTouchTargetOverhang}"> 
       <TextBlock Text="{Binding Type, StringFormat=\{0:C\}}" FontSize="32" HorizontalAlignment="Right" /> 
      </Border> 
     </Grid> 
    </DataTemplate> 
</phone:LongListSelector.ItemTemplate> 

और ये मेरे delete_click समारोह के शुरू होने से आइटम को निकालने के लिए है:

private void DeleteItem_Click(object sender, RoutedEventArgs e) 
    {    
     var menItem = (MenuItem)sender; 
     editCartItem = (Model.Cartitem)menItem.DataContext; 

     cartIndex = editCartItem.Id; 

     deleteIndex = this.cartList.FindIndex(FindItem); 

दो हटाए गए, (मॉडल के बाद। कार्टिटम) menItem.DataContext पहले हटाए गए आइटम को वापस कर देता है।

मैं थोड़ी देर के लिए खोज कर रहा हूं और कुछ साल पहले विभिन्न ढांचे और परिदृश्यों के लिए इसी तरह के मामले पाए हैं। मैं जानना चाहता था कि WP8 में ऐसा करने के लिए एक अद्यतन विधि थी या नहीं।

मैंने कन्टेक्स्टमेनू के डाटाएन्टेक्स्ट को मैन्युअल रूप से लोड या ओपन किए गए ईवेंट के साथ फिर से असाइन करने में सुझाव देखा है, लेकिन डेटाकॉन्टेक्स्ट अभी भी एलएलएस में एक विशिष्ट आइटम पर निर्भर करता है। तो मैं सिर्फ एलएलएस के संदर्भ को इंगित नहीं कर सकता।

मैंने यह भी देखा है कि इसे पैच here के साथ एक बग के रूप में इंगित किया गया है जो मेरी समस्या की तरह लगता है, लेकिन मुझे पैच को लागू करने या WP8 के साथ मेरी स्थिति से संबंधित होने पर कोई जानकारी नहीं थी।

मैं यह भी सुनिश्चित कर रहा हूं कि एलएलएस की चयनित वस्तु को मंजूरी दे दी गई है और प्रत्येक ऑपरेशन के बाद इसका कोई आइटम उपलब्ध नहीं होने के बाद अपने आइटम को फिर से असाइन करने का प्रयास किया है।

सही दिशा में कोई भी मदद या सलाह बहुत अच्छी होगी। मैंने यहां इस बारे में कुछ पोस्ट देखी हैं, लेकिन मुझे विश्वास है कि मैंने पहले से ही उन बिंदुओं को पारित कर दिया है (जैसे कि मेनू मेनू प्राप्त करना और एक पर्यवेक्षण चयन का उपयोग करना ...)।

उत्तर

0

मैं सिर्फ एक simular समस्या का सामना करते आया:

जब एक लिस्टबॉक्स में आइटम डाले MENUITEM नए जोड़े गए आइटम से संबंधित होने के DataContext सही ढंग से सेट नहीं है। ,

 MyListBox.ItemsSource = null; 
     MyListBox.Items.Clear(); 
     MyListBox.ItemsSource = theList; 

सुनिश्चित नहीं हैं कि अगर यह भी अपनी समस्या के लिए काम करेगा ...
इसके अलावा कई के साथ listboxes के लिए प्रदर्शन प्रभाव:

वैकल्पिक हल कार्यान्वयन के लिए मैं समाप्त हो गया एक आइटम जोड़ने के बाद लिस्टबॉक्स के पुनर्निर्माण के लिए था वस्तुओं पर विचार किया जाना चाहिए।

+0

मैं वास्तव में से प्राप्त-जाना कुछ इसी तरह का उपयोग कर रहा है। इसका मेरे मुद्दे पर कोई असर नहीं पड़ता है। इसके अलावा, चूंकि मैं एलएलएस के साथ काम कर रहा हूं, इसमें एक साधारण साफ़() फ़ंक्शन नहीं है। एक ClearValue फ़ंक्शन है जो निर्भरता लेता है, मैं इसे आज़मा दूंगा। – Poken1151

+0

एलएलएस के लिए मैं निम्नलिखित की तरह कुछ लागू करने में सक्षम था: 'this.LLSStructure.ItemsSource = null; यह .LLSStructure.ClearValue (FrameworkElement.DataContextProperty); ' यह एक दृश्य समस्या हल हो गई थी, लेकिन यह अभी भी ContextMenu के प्रचार में नहीं है। तो सूची को हटाने से आखिरकार एक सदस्य इटिम का नेतृत्व होगा जो अस्तित्व में नहीं है। – Poken1151

2

XAML:

<toolkit:ContextMenu Opened="ContextMenu_Opened">... </toolkit:ContextMenu> 

C#

private void ContextMenu_Opened(object sender, RoutedEventArgs e) 
{ 
    var menu = (ContextMenu)sender; 
    var owner = (FrameworkElement)menu.Owner; 
    if (owner.DataContext != menu.DataContext) 
     menu.DataContext = owner.DataContext; 
} 

आप देख सकते हैं: Windows Phone Toolkit Context Menu Items have wrong object bound to them when an item is removed and then added

संबंधित मुद्दे