2012-01-25 16 views
6

के अंत में कनवर्टर्स को प्रत्येक कीस्ट्रोक पर कॉल किया जा रहा है। मुझे .NET 4.0 पर स्विच करने के बाद डेटा एंट्री के साथ समस्या हो रही है। मेरे Xceed 3.7 ग्रिड में, उपयोगकर्ता किसी सेल में एक मान टाइप करने में सक्षम होता था, और जब वे दूर क्लिक करते थे या एंटर दबाते थे, तो बाध्य कनवर्टर की ConvertBack विधि को कॉल किया जाएगा, उपयोगकर्ता इनपुट मान को पार्स करना और वांछित प्रारूप में संग्रहीत करना ।उपयोगकर्ता इनपुट

अब

अचानक, इस हो रहा है हर कीस्ट्रोक - जो एक बड़ी समस्या का कारण है, क्योंकि उपयोगकर्ता एक नंबर मिटा देता है और शुरू होता है, तो एक और एक टाइपिंग, (सुविधा देता -100 कहते हैं), जैसे ही वे लिखते ही ऋणात्मक चिह्न, कन्वर्टबैक आग और अपवाद फेंकता है क्योंकि "-" एक पारदर्शी स्ट्रिंग नहीं है, और मान वापस किया जाता है।

मुझे लगता है कि समस्या बहुत स्पष्ट है, इसलिए अब मैं कुछ कोड में पेस्ट करूंगा।

<xcdg:DataGridControl x:Name="AggCatGrid01" 
     ItemsSource="{Binding Source={StaticResource myDataSource}}" > 
<xcdg:DataGridControl.Columns> 
     ... 
     <xcdg:Column VisiblePosition="0" FieldName="SomeValue" Title="Some Value" 
        CellEditor="{StaticResource PercentageEditor}" 
        CellContentTemplate="{StaticResource EditablePercent2CellContentTemplate}" /> 

datagrids सभी शेयर एक ही शैली:

<Style x:Key="{x:Type xcdg:DataGridControl}" TargetType="{x:Type xcdg:DataGridControl}"> 
    <Setter Property="UpdateSourceTrigger" Value="CellEndingEdit"/> 
    <Setter Property="AutoCreateColumns" Value="False"/> 
    <Setter Property="EditTriggers" Value="BeginEditCommand, CellIsCurrent, ActivationGesture"/> 
    <Setter Property="CellEditorDisplayConditions" Value="CellIsCurrent"/> 
    <Setter Property="NavigationBehavior" Value="CellOnly"/> 

सूचना है कि UpdateSourceTriggerCellEndingEdit पर सेट है उपयोगकर्ता इनपुट के लिए

स्तंभों को इस रूप दिखाई देते हैं। मैंने सोचा होगा कि कन्वर्टर्स को बुलाए जाने के लिए यह सही होगा और बाध्य मूल्य अपडेट किया जाएगा। जो भी नियंत्रण है जो अभी भी .NET4 को स्विच करके बदल गया है।

यहाँ आप ऊपर उपयोग देखा स्तंभ के लिए डेटा टेम्पलेट है:

<!-- Styles used when editable cells are being edited. --> 
<xcdg:CellEditor x:Key="PercentageEditor"> 
    <xcdg:CellEditor.EditTemplate> 
     <DataTemplate> 
      <xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}" 
            Text="{xcdg:CellEditorBinding Converter={StaticResource EditablePercentageConverter}}" /> 
     </DataTemplate> 
    </xcdg:CellEditor.EditTemplate> 
</xcdg:CellEditor> 

मुझे लगता है कि कनवर्टर कोड में ही अप्रासंगिक है, तो मैं इसे बाहर छोड़ देंगे, जब तक यह अनुरोध किया है। समस्या यह है कि इसे हर कीस्ट्रोक कहा जा रहा है।

यदि आप इस पर कोई प्रकाश डाल सकते हैं, तो मैं उत्साही होगा। मेरा मतलब है, मुझे अपने सभी .NET 4.0 एन्हांसमेंट्स को वापस लेना पड़ सकता है, या मेरे अगले रिलीज को मेरे महीने के बाद से मेरे सभी डेटाग्रिड्स को फिर से लिखना पड़ सकता है ताकि इसका कोई समाधान न हो तो xceed का उपयोग नहीं किया जा सके। धन्यवाद दोस्तों।


अद्यतन # 1

मैं वास्तव में एक मामूली चतुर वैकल्पिक हल (मेरी विनम्र राय में) जहाँ मैं एक डमी TextBlock परिचय CellEditorBinding Xceed बलों हमें DataTemplate में उपयोग करने के लिए पकड़ करने के लिए के साथ आया था। मैंने फिर सेल इनपुटर बाइंडिंग की बजाय टेक्स्टब्लॉक की टेक्स्ट प्रॉपर्टी से जुड़ने के लिए अपना इनपुट कंट्रोल बदल दिया, जिसने मुझे अपना बाध्यकारी मोड निर्दिष्ट करने की अनुमति दी। यहां मैं मोड को 'खोया फोकस' पर सेट करने में सक्षम था और बड़ी समस्या हल हो गई थी! कन्वर्टर को अब प्रत्येक कीस्ट्रोक पर नहीं कहा जा रहा है, लेकिन केवल तभी जब उपयोगकर्ता सेल छोड़ देता है या एंटर दबाता है।

<xcdg:CellEditor x:Key="PercentageEditor"> 
    <xcdg:CellEditor.EditTemplate> 
     <DataTemplate> 
      <Grid>       
       <TextBlock x:Name="bind_source" Text="{xcdg:CellEditorBinding}" Visibility="Collapsed"/> 
       <xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}" 
        Text="{Binding ElementName=bind_source, Path=Text, Mode=TwoWay, UpdateSourceTrigger=LostFocus, Converter={StaticResource EditablePercentageConverter}}" /> 
      </Grid> 
     </DataTemplate> 
    </xcdg:CellEditor.EditTemplate> 
</xcdg:CellEditor> 

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

User must hit ESC in this situation to continue editing cells. Simply clicking away or changing the value back to something valid doesn’t work.

मैं अभी भी एक और अधिक सुरुचिपूर्ण समाधान है कि ठीक कर देंगे के लिए उम्मीद कर रहा हूँ। http://silverlightdatagrid.com/CS/forums/permalink/31548/31516/ShowThread.aspx#31516:


अद्यतन # 2

मैं Xceed समर्थन मंचों जो इस पोस्ट में मुझे के रूप में ही इस मुद्दे को प्रस्तुत पर एक डेवलपर पाया। CellEditorBinding केवल PropertyChanged सत्यापन समर्थन करने के लिए लगता है जो:

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

दुर्भाग्य से कोई समाधान कभी नहीं दिया गया था। उन्होंने अपडेट स्रोत ट्रिगर को और अधिक सुंदर ढंग से बदलने के लिए एक रणनीति प्रस्तुत की जो मैं अपनाने में सक्षम था, लेकिन मुझे अभी भी सेल को फ्रीज करने की सत्यापन त्रुटि की समस्या है जब तक कि उपयोगकर्ता ईएससी को हिट नहीं करता।

<xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}" 
    Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=xcdg:DataCell}, 
        Path=Content, UpdateSourceTrigger=LostFocus, 
        Converter={StaticResource EditablePercentageConverter}}" /> 

अद्यतन # 3

मैं पुष्टि की है कि Xceed डेटा ग्रिड संस्करण 4.3 (परीक्षण पर) पर अपडेट करते हुए, समस्या दूर सब अपने आप ही चला गया, उस संस्करण के रूप में, आगे बढ़ें xcdg:CellEditorBindingUpdateSourceTrigger .Net4.0 के साथ असंगतता को अपडेट किया गया। चूंकि, हालांकि, एक नए लाइसेंस (हास्यास्पद) के लिए भुगतान करने से पहले Xceed के लिए लाइसेंस में केवल 6 महीने के बग फिक्स अपडेट शामिल हैं, और मुझे लगता है कि उपयोग करने के लिए एक अपमानजनक $ 1200 एकल डेवलपर लाइसेंस शुल्क अधिकृत करने वाली कोई भी कंपनी नहीं देखती है इस एक मामूली बग के लिए नवीनतम Xceed dll, मैं अभी भी Xceed के 3.7 संस्करण में एक पूर्ण कार्यवाही खोजने का प्रयास करने जा रहा हूं। मैं उन डेवलपर्स के लिए 'समाधान' पेश करूंगा जिनके पास जला देने के लिए धन की पहुंच है।

जैसा कि यह पता चला है, 4.3 तक अपग्रेड करने से समस्या हल नहीं हुई है। यह केवल इसलिए दिखाई दिया क्योंकि मैं अपने पिछले परिवर्तन को वापस करने के लिए भूल गया था। यहां तक ​​कि नवीनतम संस्करण में, Xceed ने अभी भी संपत्ति CellEditorBinding पर संपत्ति का खुलासा नहीं किया है।

+0

यदि इसे हर कुंजी स्ट्रोक कहा जा रहा है, तो ऐसा लगता है कि बाध्यकारी 'UpdateSourceTrigger = PropertyChanged' का उपयोग कर रहा है। अपने बाध्यकारी और सेटिंग को 'लॉस्टफोकस' में जोड़ने या 'xcdg: CellEditorBinding' को नियमित बाध्यकारी के साथ बदलने का प्रयास करें। – Rachel

+0

बाध्यकारी स्थापित करने के लिए कोई कोड ज़िम्मेदार नहीं है। डेटाग्रिड कॉलम पर "फील्डनाम" संपत्ति को स्रोत संग्रह में बाध्य सबकुछ संभालता है। मैं xcdg को प्रतिस्थापित करने के तरीके के बारे में सुझाव चाहता हूं: CellEditorBinding। मैं इस धारणा के तहत था कि आगे बढ़कर किसी अन्य तरीके से काम नहीं किया। – Alain

उत्तर

3

समाधान है:

<xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}" 
    Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=xcdg:DataCell}, 
        Path=Content, UpdateSourceTrigger=LostFocus, 
        Converter={StaticResource EditablePercentageConverter}}" /> 

वास्तव में यह करने के लिए कोई दूसरा रास्ता नहीं है। यदि आप Xceed के नवीनतम संस्करण का उपयोग नहीं कर रहे हैं, तो यह सत्यापन त्रुटियों का भी नेतृत्व करेगा, लेकिन नवीनतम संस्करण में, इस नए बाध्यकारी पथ का उपयोग पूरी तरह से काम करता है। मुझे अभी भी लगता है कि यह एक हैक है, और उम्मीद है कि आगे बढ़ने का एहसास होगा कि इसे CellEditorBinding पर कुछ और गुणों का खुलासा करने की आवश्यकता है।

0

मुझे XCeed नियंत्रण नहीं पता है, इसलिए यह केवल शिक्षित अनुमान है।

मैं व्यक्तिगत रूप से बाध्यकारी घोषणा है जैसे कि यह एक नियमित रूप से नेट नियंत्रण में किया जाता है करने के लिए UpdateSourceTrigger जगह होगा:

Text="{xcdg:CellEditorBinding Converter={StaticResource EditablePercentageConverter}, UpdateSourceTrigger=CellEndingEdit}" 

इसके अतिरिक्त, क्योंकि नियंत्रण वाणिज्यिक है, तो आप Xceed से कुछ तकनीकी समर्थन के हकदार हैं, ।

+1

यह एक उचित सुझाव है, लेकिन xcdg: CellEditorBinding में UpdateSourceTrigger प्रॉपर्टी नहीं है: [क्लास सदस्य] (http://doc.xceedsoft.com/products/xceedwpfdatagrid/Xceed.Wpf.DataGrid.v4.2~ Xceed.Wpf.DataGrid.Markup.CellEditorBindingExtension_members.html)। Xceed वर्तमान कॉलम के "फील्डनाम" पैरामीटर का उपयोग कर संपादक सामग्री के लिए बाध्यकारी को जोड़ने की देखभाल करता है। – Alain

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