2010-10-04 25 views
12

पर सॉर्ट नहीं करता है, मैं एक एमवीवीएम डिज़ाइन पैटर्न का उपयोग करके अपना पहला WPF एप्लिकेशन लागू करने की कोशिश कर रहा हूं।WPF4 डेटाग्रिड कॉलम हेडर

मैंने एक ऐसा ऐप्लिकेशन बनाया जो एक पर्यवेक्षण योग्यता <> पर डाटाबेसिंग कर रहा है। एप्लिकेशन ठीक प्रस्तुत करता है, लेकिन जब मैं कॉलम हेडर पर क्लिक करता हूं तो डेटाग्रिड पंक्तियों को फिर से क्रमबद्ध करने की अपेक्षा करता है।

मैंने उन पदों पर शोध किया है जिन्होंने कहा: डेटा स्रोत को IENumerable को लागू करना है, मेरा करता है। मुझे CanUserSortColumns और/या CanUserSort (प्रत्येक कॉलम पर) सेट करने की आवश्यकता है, मैंने किया था। मैं सॉर्टिंग कॉलबैक फ़ंक्शन निर्दिष्ट करके कस्टम प्रकार को कार्यान्वित कर सकता हूं, मैंने किया था।

इनमें से कोई भी मदद नहीं करता है। डीबगर में, मेरे _customerGrid_Sorting फ़ंक्शन को कभी भी कॉल नहीं किया जाता है और कॉलम हेडर पर क्लिक करने का कोई प्रभाव नहीं पड़ता है।

क्या मुझे XAML में कुछ याद आ रहा है? क्या कोई अन्य इंटरफ़ेस लागू करने की आवश्यकता है? मुझे अभी बहुत खो गया है, इसलिए किसी भी मदद की सराहना की जाती है।

XAML:

 <DataGrid Name="_customerGrid" 
      AutoGenerateColumns="False" 
      CanUserSortColumns="True" 
      ColumnHeaderStyle="{StaticResource columnHeaderStyle}" 
      HorizontalAlignment="Left" 
      ItemsSource="{Binding Path=AllCustomers}" 
      RowDetailsVisibilityMode="VisibleWhenSelected" 
      RowStyle="{StaticResource DataGridRowStyle}" 
      SelectionUnit="FullRow" 
      Sorting="_customerGrid_Sorting" 
      VerticalAlignment="Top"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding Path=CustID}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding Path=Name}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

उत्तर

23

समस्या इस कोड

<DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=CustID}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

डिफ़ॉल्ट काम करता है छँटाई के रूप में हर जगह केवल DataGridTextColumn, DataGridComboBoxColumn, आदि के लिए कहा गया है है।

अब यहां ग्रिड को पता नहीं है कि कैसे सॉर्ट करना है क्योंकि आपने डेटा टेम्पलेट और उसके अंदर एक लेबल परिभाषित किया है। कुछ अन्य व्यक्ति ने DataTemplate के अंदर एक SstackTemplate, आदि को परिभाषित किया हो सकता है। तो डेटाग्रिड यह नहीं जानता कि इसे कैसे क्रमबद्ध किया जाए।

मैं आपको जल्द ही एक नमूना कोड पोस्ट करने की कोशिश करूंगा जैसा कि हम इस तरह के DataGridTemplateColumn के लिए कर सकते हैं। लेकिन उम्मीद है कि मैंने जो दिशा दी है वह आपको मदद करता है !!


ऐसा लगता है कि उत्तर बहुत आसान है। मैं MVVM का उपयोग कर एक नमूना डेटा ग्रिड के साथ यह कोशिश की, लेकिन मेरी समाधान आप के लिए काम करना चाहिए मुझे लगता है

सब कुछ DataGridTemplateColumn नीचे में ठीक है, लेकिन आप एक बहुत ही महत्वपूर्ण विशेषता SortMemberPath बुलाया याद कर रहे हैं। Thw WPF को पता होना चाहिए कि किस संपत्ति को सॉर्ट करना चाहिए।

मूल एक जो आप इस

<DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=Name}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 


मैं अपने डेटा संरचनाओं नहीं जानता की तरह दिखता था। लेकिन संशोधित व्यक्ति को इस

<DataGridTemplateColumn SortMemberPath="Name" Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=Name}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 

मुझे आशा है कि यह आपकी मदद करेगा !! अगर यह आपको मदद नहीं करता है मुझे पता है मैं कुछ ब्लॉग में अपने आवेदन पोस्ट करने की कोशिश करेगा, (मैं हालांकि यह करने के लिए आलसी हूँ !!)

+0

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

+1

@ पॉल - मुझे लगता है कि आप "SortMemberPath" नामक एक विशेषता खो रहे थे। आशा करता हूँ की ये काम करेगा!! – GuruC

+0

महान उत्तर गुरु! आपके सहयोग के लिए धन्यवाद! मैं डेटाग्रिड टेम्पलेट कॉलम पर SortMemberPath = "CustID" (उदाहरण के लिए) निर्दिष्ट करके जोड़ दूंगा, मैं डेटाग्रिड पर सॉर्टिंग विशेषता को खत्म करने और आईसीओएमपेयर के अपने कस्टम कार्यान्वयन को हटाने में सक्षम था। मैं आपका जवाब दूसरों की मदद करता हूं। अगर किसी के पास समाधान के बारे में कोई सवाल है, तो मैं उनकी मदद करने की कोशिश करूंगा। –

0

इस एक का प्रयास करें: SortMemberPath = "पूर्ण"

<DataGridTemplateColumn Header="CustID" SortMemberPath="Complete" MinWidth="90"  
CanUserSort="True" CanUserResize="True"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Path=CustID}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

आपका उत्तर स्वीकृत उत्तर से अलग कैसे है? SortMemberPath के मान को डेटास्रोत के कॉलम का नाम देना चाहिए। "पूर्ण" मेरे सदस्य कॉलम में से एक नहीं है। –

+0

मुझे उपरोक्त उत्तर नहीं मिला, जब मैं अपना संपादन कर रहा था तो उसे पोस्ट किया जा सकता था। हेडर नाम के संबंध में, मैंने इसे अपने डब्लूपीएफ परीक्षण की कोशिश की, अगर यह काम करता है तो आपको हेडर नाम बदलने की जरूरत है। – Doro

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