2011-03-07 13 views
7

मेरे पास एक डब्ल्यूपीएफ एप्लीकेशन में डेटाग्रिड है जो ऑब्जेक्ट्स के ऑब्जेर्जेबल कोलेक्शन में बांधता है, और सब कुछ ठीक काम करता है। अब अगर मैं रनटाइम के दौरान डेटाग्रिड में एक सेल संशोधित करता हूं, और सामग्री को हटा देता हूं, तो सेल को खाली छोड़ दें। देखने योग्य चयन का संबंधित मान संशोधित नहीं किया जाएगा, यह पुराना मान होगा। लेकिन जब मैं datagrid युक्त विंडो से बाहर निकलने और खिड़की को पुनः आरंभ, यह एक XamlParseException फेंकता है, का कहना है:डब्ल्यूपीएफ डाटाग्रिड आइटमसोर्स बाइंडिंग इश्यू

StackTrace: 
     at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri) 
     at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
     at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) 
     at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) 
     at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 
     at VO3.Start.InitializeComponent() in c:\VO\Trunk\VO3\Start.xaml:line 1 
     at VO3.Start..ctor() in C:\VO\Trunk\VO3\Start.xaml.cs:line 103 
    InnerException: System.InvalidOperationException 
     Message='DeferRefresh' is not allowed during an AddNew or EditItem transaction. 
     Source=PresentationFramework 
     StackTrace: 
      at System.Windows.Data.CollectionView.DeferRefresh() 
      at System.Windows.Controls.ItemCollection.SetCollectionView(CollectionView view) 
      at System.Windows.Controls.ItemCollection.SetItemsSource(IEnumerable value) 
      at System.Windows.Controls.ItemsControl.OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
      at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
      at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
      at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 
      at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) 
      at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal) 
      at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value) 
      at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value) 
      at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value) 
      at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value) 
     InnerException: 

"संपत्ति 'System.Windows.Controls.ItemsControl.ItemsSource' सेट एक अपवाद फेंक दिया" यह नहीं होगा जब तक मैंने खिड़की बंद कर दी, तब तक अपवाद फेंक दें, डाटाग्रिड में कोई भी सेल खाली नहीं है। विंडो प्रारंभ करने के पहले मैंने संग्रह को भी चेक किया है कॉम्पोनेंट लाइन और यह बिल्कुल ठीक दिखता है, सभी ऑब्जेक्ट्स का सही मान होता है, खाली या शून्य नहीं होता है। मैं यह नहीं समझ सकता कि यह इस अपवाद को क्यों फेंक रहा है। कोई विचार? अग्रिम धन्यवाद।

XAML:

<DataGrid HeadersVisibility="All" RowHeight="19" AutoGenerateColumns="False" Grid.Row="1" CanUserResizeColumns="False" 
           CanUserAddRows="False" CanUserDeleteRows="False" Block.TextAlignment="Right" Grid.RowSpan="2" CanUserReorderColumns="False" 
           ItemsSource="{Binding Collection}" Width="132" HorizontalAlignment="Right" Margin="10,0,10,0" CanUserSortColumns="False" 
           IsEnabled="{Binding ElementName=CheckBox, Path=SelectedIndex, Converter={StaticResource startEnabledConverter}}"> 
+0

संग्रह में आइटमों पर संपत्तियों को कम करने योग्य हैं? आपकी प्रॉपर्टी अपडेट कब की जाती है (उदा। प्रॉपर्टी चेंज, लॉसफोकस, आदि)। – CodeWarrior

+0

संग्रह में ऑब्जेक्ट के गुण शून्य नहीं हैं, वे प्रॉपर्टीchanged पर अपडेट किए गए हैं। लेकिन पिछले अनुभव से, जब क्षेत्र खाली छोड़ दिया जाता है इसका मतलब यह नहीं है कि संग्रह में संबंधित वस्तु शून्य है। और मैंने चेक किया है कि मान को खाली छोड़ दिया गया है कि संग्रह में ऑब्जेक्ट अभी भी पुराना मान है।खिड़की फिर से खुलने से पहले मैंने फिर से मूल्यों की जांच की और कोई खाली संपत्ति नहीं है। कुछ कारणों से डब्ल्यूपीएफ एक अपवाद फेंकता है जब यह डेटाग्रिड –

+0

की आइटम्ससोर्स निर्भरता प्रॉपर्टी की सेट प्रॉपर्टी पर जाता है, तो मेरा सुझाव है कि आप अपने यूआई के किसी भी अन्य भाग की तलाश करें जो एक ही पर्यवेक्षण चयन से जुड़ा हुआ है और परीक्षण के लिए उस संग्रह में सभी बाध्यकारी को हटा देता है आप फिर से अलगाव में समस्या से ऊपर है। यदि आप भाग्यशाली हैं, तो यह केवल अन्य मुद्दों द्वारा उपयोग किए जाने वाले correponding संग्रह दृश्य के साथ एक मुद्दा है। –

उत्तर

3

वहाँ डेटा ग्रिड & DeferRefresh साथ काफी कुछ मुद्दों किया गया है दिखाई दें। यहाँ दो relevantposts हैं:

सामान्य सिफारिश एक IEditableCollectionView (के रूप में ObservableCollection बाध्यकारी जब पिछले मैंने देखा के दौरान एक ListCollectionView हो जाता है जो तुम्हारा डिफ़ॉल्ट रूप से किया जाएगा) के रूप में डेटा ग्रिड के संबद्ध दृश्य की जांच करने और IsAddingNew & IsEditingItem को जांच करने के लिए हो रहा है देखें कि दृश्य को संशोधित करना सुरक्षित है या नहीं। इस तरह के संशोधनों में डेफररफ्रेश शामिल होगा, जो अनिवार्य रूप से एक डिस्पोजेबल है जो दृश्य में संशोधन को बैच करने के लिए उपयोग किया जाता है।

जहाँ तक मैं देख सकता हूं, आपके पास समस्या यह है कि डेटाग्रिड एक लेनदेन के माध्यम से मिडवे है, या दृश्य यह मानने के लिए सेट है, जबकि आप आइटमसोर्स बदल रहे हैं (जो बदल जाएगा या पूरी तरह से संबंधित बाउंड को बदल देगा राय)। कि आप एक सेल को साफ़ कर रहे हैं लेकिन यह अभी तक अंतर्निहित डेटा को संशोधित नहीं कर रहा है, इसका तात्पर्य है कि यह एक संपादन (BeginEdit) शुरू हो गया है, लेकिन अभी तक प्रतिबद्ध नहीं है (CommitEdit), जो तब होता है जब आप डिफ़ॉल्ट रूप से सेल बदलते हैं।

यह हो रहा है कि जब आप & बंद कर रहे हैं तो यह हो रहा है कि खिड़की को फिर से खोलने का तात्पर्य है कि कुछ संरक्षित राज्य चारों ओर रखा जाता है जो अभी भी सोचता है कि एक लेनदेन प्रगति पर है। शायद यह अभी भी वही ListCollectionView का उपयोग पहले से ही कर रहा है, और अभी भी IsEditingItem सत्य पर सेट है?

यह सुनिश्चित करने की संभावना है कि विंडो बंद करने से पहले किसी भी और सभी संपादन किए जाएं।

+0

यह सही है। और सबसे अच्छा समाधान इस व्यवहार का उपयोग करना है: http://stackoverflow.com/a/6467171/724944 – surfen

0

यदि क्षेत्र है कि आप बाहर रिक्त कर रहे हैं प्रकार स्ट्रिंग की नहीं है, तो यह ठीक ढंग से अद्यतन नहीं किया जा सकता।

उदाहरण के लिए, यदि यह "int" है और आप सेल को खाली करते हैं तो आपके व्यूमोडेल की "int" प्रॉपर्टी सेट नहीं होगी।

जिस तरह से मैंने इस समस्या को हल किया है वह कनवर्टर के साथ है जो इंकों के लिए रिक्त मानों को शून्य में परिवर्तित करता है।

आशा है कि यह