2009-09-02 13 views
10

मेरे पास ItemsSource पर बाध्यकारी है। लोड/डाटाबेस घटनाओं पर SelectionChanged ईवेंट फायरिंग क्यों है? मुझे लगता है कि ऐसा इसलिए है क्योंकि 'डिफ़ॉल्ट' आइटम यानी इंडेक्स 0 चुना जाता है।डब्ल्यूपीएफ लिस्टव्यू चयन चयनित घटना

मैं इसे कैसे अक्षम कर सकता हूं, क्योंकि आइटम का चयन करते समय डेटा के साथ अन्य स्रोत अपडेट किए जाते हैं।

धन्यवाद Petrus

+0

हे पेट्रस जोड़ा। क्या आप अपना कोड साझा कर सकते हैं? – Anvaka

उत्तर

1

प्रतिक्रियाओं के लिए धन्यवाद।

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

मेरे चयन में परिवर्तन किया गया ईवेंट जैसा कि आप देख सकते हैं मैं चयनित वस्तुओं से संबंधित डेटा के साथ लोड होने के लिए अन्य ऑब्जेक्ट्स को सूचित करता हूं। मैं केवल तभी ऐसा करना चाहता हूं जब कोई चुना जाता है लेकिन डिफ़ॉल्ट सेट नहीं किया जाता है। मुझे इन सूची दृश्यों का प्रतिनिधित्व करना है जो समान डेटा का प्रतिनिधित्व करते हैं लेकिन लोड किए गए किसी भी आइटम में कोई आइटम नहीं होना चाहिए।

मैंने देखा है कि डिफ़ॉल्ट चयनित अनुक्रमणिका सूचीदृश्य के लिए प्रॉपर्टी विंडो पर -1 पर सेट है। मैं इसे सूची_लोडेड ईवेंट पर भी कोड सेट कर सकता हूं, लेकिन तब तक पहला चयन चेंज किया गया है।

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView" 
        DataContext="{StaticResource ActiveCasesViewSource}" 
        ItemsSource="{Binding}" 
        ItemTemplate="{StaticResource CasesItemTemplate}" 
        SelectionMode="Single" 
        SelectionChanged="ActiveCasesView_SelectionChanged" 
        ScrollViewer.CanContentScroll="True" 
        ScrollViewer.VerticalScrollBarVisibility="Auto" > 
</ListView> 

private void ActiveCasesView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (mouseClicked) 
      if (e.AddedItems.Count > 0) 
       App.Messenger.NotifyColleagues(App.MSG_SELECT_ACTIVE_CASE, ((CaseViewModel)ActiveCasesView.SelectedItem).CaseNumber); 
    } 

मैं एक संकेतक है कि मैं SelectionChanged घटना में सूचीदृश्य पर क्लिक किया है स्थापित करने के लिए PreviewMouseDown गयी। यह मदद करता है लेकिन मुझे विश्वास नहीं है कि यह सबसे अच्छा समाधान है।

धन्यवाद Petrus

4

ListView SelectionChange आग नहीं करना चाहिए अगर आप केवल ItemsSource संपत्ति निर्धारित किया है। हालांकि यदि आप चयनित इंडेक्स प्रॉपर्टी को अपने डेटा की संपत्ति पर जोड़ते हैं तो कॉन्टैक्ट ऑब्जेक्ट चयन बाध्य संपत्ति द्वारा निर्दिष्ट इंडेक्स पर ले जाएगा।

<ListView SelectionChanged="Selector_OnSelectionChanged" 
        ItemsSource="{Binding Path=Items}" 
        ></ListView> 

लेकिन यह करता है:

<ListView SelectionChanged="Selector_OnSelectionChanged" 
        SelectedIndex="{Binding Path=SelectedIndexValue}" 
        ItemsSource="{Binding Path=Items}" 
        ></ListView> 

क्योंकि SelectedIndex बंधन के माध्यम से SelecteIndexValue पर सेट है

इस पृष्ठ लोड होने Selector_OnSelectionChanged ईवेंट सक्रिय नहीं है।

इससे बचने के लिए और अभी भी अपने मार्कअप में बाइंडिंग्स को अपने डेटा के चयनित इंडेक्स वैल्यू को बाध्यकारी से पहले -1 (प्रारंभिक कॉम्पोनेंट() को आपके फॉर्म कन्स्ट्रक्टर में कॉल करने से पहले सेट करें) सेट करें।

उम्मीद है कि इससे मदद मिलती है।

0

आप अपने बंधन में -1 SelectedIndex गुण सेट करने के लिए कोशिश कर सकते हैं, लेकिन यह भी एक सुरुचिपूर्ण समाधान नहीं है।

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView" 
        DataContext="{StaticResource ActiveCasesViewSource}" 
        ItemsSource="{Binding}" 
        ItemTemplate="{StaticResource CasesItemTemplate}" 
        SelectionMode="Single" 
        SelectionChanged="ActiveCasesView_SelectionChanged" 
        ScrollViewer.CanContentScroll="True" 
        ScrollViewer.VerticalScrollBarVisibility="Auto" 
**SelectedIndex="-1"**> 
</ListView> 

मैंने आपके व्यवहार को पुन: उत्पन्न करने की कोशिश की लेकिन सफलता के बिना। आइटमसोर्स संग्रह का प्रकार क्या है जिसे आप बाध्यकारी कर रहे हैं?

+0

मैं कस्टम व्यू मॉडेल के रीडोनली कोलेक्शन पर बाध्यकारी हूं। – Petrus

0

आप कार्रवाई

bool loaded = false; 

window.Loaded += new RoutedEventHandler(MainWindow_Loaded); 

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    windowLoaded = true; 
} 

private void ActiveCasesView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 

if(!loaded) 
return ; 

//do actions here .... 

} 
+0

उस स्थिति में, पहला आइटम अनुपयोगी हो सकता है। –

1

मैं अगर आप अभी भी इस के साथ मदद की जरूरत है पता नहीं है, लेकिन मैं में एक चर कि SelectedIndex पटरियों बनाकर इस समस्या का समाधान, ब्लॉक करने के लिए खिड़की से भरी हुई घटना का उपयोग कर सकते मेरी मामला - जब शुरुआत में यह हमेशा 0 होता है तो मेरे लिए यह थोड़ा आसान होता है, हालांकि यदि आप उपयुक्त इंडेक्स के व्यूमोडेल को सूचित करते हैं, तो मैंने बस

ComboBox box = e.OriginalSource as ComboBox; 
if (_previousIndex == cb.SelectedIndex) return; 
//do stuff you need to do with a new SelectedIndex 
संबंधित मुद्दे