मैं अपनी परियोजनाओं में से एक में समूह उप-योग पंक्तियों के साथ एक काट दिया-साथ डेटा ग्रिड है लगता है कोई अच्छा सुविधाओं का उपयोग करता। हम आपके द्वारा उठाए गए कुछ मुद्दों के बारे में चिंतित नहीं थे, जैसे कि छुपाएं और कॉलम को सॉर्ट करना, इसलिए मुझे यह सुनिश्चित नहीं है कि इसे इसके लिए बढ़ाया जा सकता है। मुझे यह भी पता है कि प्रदर्शन समस्याएं हो सकती हैं जो समस्या हो सकती हैं बड़े सेट (मेरी खिड़की 32 अलग डेटाग्रिड्स - आउच का संचालन कर रही है)। लेकिन यह मैंने देखा है कि अन्य समाधानों से एक अलग दिशा है, इसलिए मैंने सोचा कि मैं इसे यहां फेंक दूंगा और देख सकता हूं कि यह आपकी मदद करता है।
मेरा समाधान शामिल हैं 2 प्रमुख घटकों में से:
1. उप-योग पंक्तियां मुख्य डेटाग्रिड में पंक्तियां नहीं हैं, लेकिन अलग डेटाग्रिड्स हैं। मेरे पास प्रत्येक समूह में वास्तव में 2 अतिरिक्त ग्रिड हैं: 1 हेडर में जो केवल तभी प्रदर्शित होता है जब समूह ध्वस्त हो जाता है, और आइटम प्रस्तुति के नीचे एक होता है। उप-योग डेटाग्रिड्स के लिए आइटमसोर्स एक कनवर्टर से आता है जो समूह में आइटम लेता है और एक समग्र दृश्य मॉडल देता है।उप-योग ग्रिड के कॉलम मुख्य ग्रिड के समान हैं (डेटाग्रिड_लोडेड में भरे हुए हैं, हालांकि मुझे यकीन है कि यह xaml में भी किया जा सकता है)।
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander Background="Gray" HorizontalAlignment="Left" IsExpanded="True"
ScrollViewer.CanContentScroll="True">
<Expander.Header>
<DataGrid Name="HeaderGrid" ItemsSource="{Binding Path=., Converter={StaticResource SumConverter}}"
Loaded="DataGrid_Loaded" HeadersVisibility="Row"
Margin="25 0 0 0" PreviewMouseDown="HeaderGrid_PreviewMouseDown">
<DataGrid.Style>
<Style TargetType="DataGrid">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=IsExpanded}"
Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Style>
</DataGrid>
</Expander.Header>
<StackPanel>
<ItemsPresenter/>
<DataGrid Name="FooterGrid" ItemsSource="{Binding ElementName=HeaderGrid, Path=ItemsSource, Mode=OneWay}"
Loaded="DataGrid_Loaded" HeadersVisibility="Row"
Margin="50 0 0 0">
<DataGrid.Style>
<Style TargetType="DataGrid">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=IsExpanded}"
Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid>
</StackPanel>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
2. फिर इस मुद्दे को कैसे सब datagrids व्यवहार करने के लिए के रूप में यदि वे एक ही ग्रिड थे प्राप्त करने के लिए है। मैंने DataGridTextColumn
(हमारे पास केवल इस मामले में टेक्स्ट है, लेकिन अन्य कॉलम प्रकारों को भी काम करना चाहिए) नामक कक्षा में DataGridSharedSizeTextColumn
नामक कक्षा में जो ग्रिड क्लास के साझा आकार समूह व्यवहार की नकल करता है, को संभाला है। इसमें एक समूह नाम के साथ एक स्ट्रिंग निर्भरता संपत्ति है और एक ही समूह में सभी कॉलम का ट्रैक रखती है। जब Width.DesiredValue
एक कॉलम में परिवर्तन होता है, तो मैं अन्य सभी कॉलम में मिनविड्थ अपडेट करता हूं और DataGridOwner.UpdateLayout()
के साथ अद्यतन को मजबूर करता हूं। यह वर्ग कॉलम रीडरिंग को भी कवर कर रहा है और जब भी डिस्प्ले इंडेक्स बदलता है तो समूह-व्यापी अद्यतन करता है। मुझे लगता है कि यह विधि तब तक किसी अन्य कॉलम प्रॉपर्टी के साथ काम करेगी जब तक कि इसमें एक सेटर हो।
चयन, प्रतिलिपि आदि के साथ काम करने के लिए अन्य परेशान चीजें थीं लेकिन यह माउसइंटर और माउसलेव घटनाओं के साथ संभालने और कस्टम कॉपी कमांड का उपयोग करके बहुत आसान हो गया।
क्या आपको इस ज़रूरतों का उत्तर देने के कोई उपाय मिले? यहां मेरा एसओ सवाल है (जिसे मैंने डुप्लिकेट के रूप में चिह्नित किया है): https://stackoverflow.com/questions/46206673/wpf-datagrid-grouping-and-totals – Simon