2010-01-24 7 views
12

समस्याएक डेटा ग्रिड

मैं एक WPF टूलकिट DataGrid है, और मुझे कई पूर्व निर्धारित स्तंभ आदेश के बीच स्विच करने में सक्षम होना चाहते हैं में स्तंभ क्रम को नियंत्रित करने के बाइंडिंग का उपयोग करना। यह एक एमवीवीएम प्रोजेक्ट है, इसलिए कॉलम ऑर्डर ViewModel में संग्रहीत हैं। समस्या यह है कि, DisplayIndex संपत्ति के लिए मुझे काम करने के लिए बाइंडिंग नहीं मिल सकती है। कोई फर्क नहीं पड़ता कि मैं मिठाई विधि सहित क्या कोशिश, this Josh Smith tutorial में, मैं मिलता है:

हैडर 'आईडी' के साथ DataGridColumn के लिए DisplayIndex सीमा से बाहर है। डिस्प्ले इंडेक्स 0 से अधिक या बराबर होना चाहिए और कॉलम से कम होना चाहिए। गणना। पैरामीटर नाम: प्रदर्शन इंडेक्स। वास्तविक मूल्य -1 था।

क्या इसके लिए कोई कामकाज है?

मैं नीचे अपना परीक्षण कोड शामिल कर रहा हूं। यदि आपको इसके साथ कोई समस्या दिखाई देती है तो कृपया मुझे बताएं।


ViewModel कोड

public class MainViewModel 
{ 
    public List<Plan> Plans { get; set; } 
    public int IdDisplayIndex { get; set; } 
    public int NameDisplayIndex { get; set; } 
    public int DescriptionDisplayIndex { get; set; } 

    public MainViewModel() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     IdDisplayIndex = 1; 
     NameDisplayIndex = 2; 
     DescriptionDisplayIndex = 0; 
     Plans = new List<Plan> 
     { 
      new Plan { Id = 1, Name = "Primary", Description = "Likely to work." }, 
      new Plan { Id = 2, Name = "Plan B", Description = "Backup plan." }, 
      new Plan { Id = 3, Name = "Plan C", Description = "Last resort." } 
     }; 
    } 
} 

योजना कक्षा

public class Plan 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

विंडो कोड - इस का उपयोग करता है Josh Smith's DataContextSpy

<Window 
    x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    xmlns:mwc="http://schemas.microsoft.com/wpf/2008/toolkit" 
    Title="Main Window" Height="300" Width="300"> 
    <Grid> 
     <mwc:DataGrid ItemsSource="{Binding Plans}" AutoGenerateColumns="False"> 
      <mwc:DataGrid.Resources> 
       <local:DataContextSpy x:Key="spy" /> 
      </mwc:DataGrid.Resources> 
      <mwc:DataGrid.Columns> 
       <mwc:DataGridTextColumn 
        Header="ID" 
        Binding="{Binding Id}" 
        DisplayIndex="{Binding Source={StaticResource spy}, Path=DataContext.IdDisplayIndex}" /> 
       <mwc:DataGridTextColumn 
        Header="Name" 
        Binding="{Binding Name}" 
        DisplayIndex="{Binding Source={StaticResource spy}, Path=DataContext.NameDisplayIndex}" /> 
       <mwc:DataGridTextColumn 
        Header="Description" 
        Binding="{Binding Description}" 
        DisplayIndex="{Binding Source={StaticResource spy}, Path=DataContext.DescriptionDisplayIndex}" /> 
      </mwc:DataGrid.Columns> 
     </mwc:DataGrid> 
    </Grid> 
</Window> 

नोट: अगर मैं सिर्फ DisplayIndex के लिए सादे नंबरों का उपयोग, सब कुछ ठीक काम करता है, तो समस्या बाइंडिंग के साथ निश्चित रूप से है।


अद्यतन 5/1/2010

मैं सिर्फ अपनी परियोजना पर एक छोटे से रखरखाव कर रहा था, और मैंने देखा है कि जब मैं यह भाग गया, समस्या मैं इस पोस्ट में चर्चा लौटा था। मुझे पता था कि आखिरी बार मैंने इसे चलाने के लिए काम किया था, इसलिए मैंने अंततः इस तथ्य को कम कर दिया कि मैंने डब्ल्यूपीएफ टूलकिट (फरवरी '10) का एक नया संस्करण स्थापित किया था। जब मैं जून 0 9 संस्करण में वापस आ गया, तो सब कुछ ठीक काम किया। तो, अब मैं कुछ कर रहा हूं जो मुझे पहले स्थान पर करना चाहिए था: मैं WPFToolkit.dll को शामिल करता हूं जो मेरे समाधान फ़ोल्डर में काम करता है और इसे संस्करण नियंत्रण में जांचता है। हालांकि, यह दुर्भाग्यपूर्ण है कि नए टूलकिट में ब्रेकिंग बदलाव है।

उत्तर

4

(मेरे पिछले जवाब रास्ता बंद ट्रैक था - तो मैं इसे नष्ट कर दिया - मैं अपने मशीन पर त्रुटि से उत्पन्न होने के बाद फिर से जवाब देने की कोशिश करेंगे)

समस्या आपके सामने आने वाली इस तथ्य की वजह से उपजी

कि जब बाइंडिंग हैं पहली बार मूल्यांकन किया गया, DataContext संपत्ति अभी भी null पर सेट है। यह, कुछ अजीब कारणों से, अभी तक मुझे अज्ञात है, -1 पर बाध्यकारी का मूल्यांकन करने का कारण बनता है।हालांकि यदि आप DataContext से पहले सेट करना सुनिश्चित करते हैं तो बाइंडिंग का मूल्यांकन किया जाएगा आप ठीक होंगे। दुर्भाग्य से यह केवल कोड-बैक में संभव हो सकता है - इसलिए रन-टाइम के दौरान, और डिज़ाइन समय में नहीं। तो डिजाइन समय में मुझे अभी भी पता नहीं है कि त्रुटि को कैसे रोकें।

कि ऐसा करने के लिए, इस प्रकार InitializeComponent को कॉल करने से पहले खिड़की के DataContext गुण सेट:

public MainWindow() 
{ 
    DataContext = new MainViewModel(); 
    InitializeComponent(); 
} 

आशा इस मदद करता है।

+0

अच्छा यह दिलचस्प है। अगर मैं अपना टेस्ट ऐप चलाता हूं, तो आपका फिक्स पूरी तरह से काम करता है। मेरे असली ऐप में, प्रश्न में 'डेटाग्रिड' वास्तव में 'UserControl' में है, और किसी कारण से, यदि मैं 'DataContextSpy' लागू करता हूं (जिसे मैंने अभी तक तब तक नहीं किया है जब से यह मेरे परीक्षण ऐप के लिए विफल नहीं हुआ था) , यह तब भी काम करता है जब मैं 'प्रारंभिक कॉम्पोनेंट() 'पर कॉल स्थगित नहीं करता हूं। मुझे लगता है कि यह होना चाहिए क्योंकि मैं 'विंडो' करने के बजाय 'ContentControl' पर' सामग्री 'सेट कर रहा हूं। दिखाएं() '। किसी भी मामले में, मेरे लिए यह हल करने के लिए समय निकालने के लिए धन्यवाद (+1 और √)। – devuxer

12

अपने प्रदर्शन इंडेक्स बाध्यकारी में FallbackValue=<idx> सेट करें, जहां <idx> आपके कॉलम की अनुक्रमणिका है। उदाहरण के लिए:

DisplayIndex="{Binding Source={StaticResource spy}, Path=DataContext.IdDisplayIndex, FallbackValue=0}" /> 
+2

पूरी तरह से काम करता है - और भी सुंदर। – ShadowChaser

+1

यह नीचे जाने का तरीका है, हाथ नीचे। –

1

मैं इसे एक उत्तर के रूप में जोड़ रहा हूं क्योंकि मैं अभी तक टिप्पणी नहीं कर सकता हूं। कारण है कि DisplayIndex का मूल्य -1 पर सेट किया जाता है:

DisplayIndex संपत्ति से पहले यह DataGrid.Columns संग्रह करने के लिए जोड़ा जाता है -1 का डिफ़ॉल्ट मान है। यह मान तब अपडेट किया जाता है जब कॉलम डेटाग्रिड में जोड़ा जाता है।

डेटाग्रिड की आवश्यकता है कि प्रत्येक कॉलम की डिस्प्ले इंडेक्स संपत्ति कॉलम की गणना -1 से 0 तक एक अद्वितीय पूर्णांक होनी चाहिए। इसलिए, जब एक कॉलम का डिस्प्ले इंडेक्स बदलता है, तो आमतौर पर परिवर्तन अन्य कॉलम के डिस्प्ले इंडेक्स को भी बदलने का कारण बनता है।

प्रदर्शन इंडेक्स मूल्य पर प्रतिबंध मान्य करें ValueCallback तंत्र द्वारा लागू किया जाता है। यदि आप मान्य मान सेट करने का प्रयास करते हैं, तो रन-टाइम अपवाद फेंक दिया जाता है।

जब डिस्प्ले इंडेक्स संपत्ति का मूल्य बदल जाता है, तो DataGrid.ColumnDisplayIndexChanged ईवेंट उठाया जाता है।

स्रोत: http://msdn.microsoft.com/en-us/library/vstudio/system.windows.controls.datagridcolumn.displayindex(v=vs.100).aspx

तो मुझे लगता है कि यह इस मूल्य की जांच करने के लिए संभव है, जब यह ऊपर उल्लिखित घटना का उपयोग कर बदला गया है।

Aviad द्वारा उल्लिखित समाधान मेरे लिए काम नहीं करता था। मैं एक UserControl में मेरे डेटा ग्रिड, ओ पी के रूप में ही है, और बदलते ViewModel निर्माता के आदेश, DataContext घोषणा है, और InitializeComponent() विधि मदद नहीं की।

पाकमैन FallbackValue विधि दूसरी तरफ बहुत अच्छी तरह से काम करती है।