2015-09-16 6 views
6

मैं एक TreeView कि इस तरह दिखता है:संग्रह दृश्य समूह समूह के साथ एक बेवकूफ XAML TreeView क्या है?

<TreeView Grid.Row="1" x:Name="InspectionResultsTreeView" 
      ItemsSource="{Binding Source={StaticResource InspectionTypeGroupViewSource}, Path=Groups}" 
      ItemTemplate="{StaticResource InspectionTypeGroupsTemplate}"> 
</TreeView> 

ItemsSource एक बंद संसाधन है कि InspectionTypeGroupViewSource के नाम से भी जाना जाता है:

<CollectionViewSource x:Key="InspectionTypeGroupViewSource" Source="{Binding Results}"> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="Inspection.InspectionType" /> 
     <PropertyGroupDescription PropertyName="Inspection" /> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

इस छोटी बात की भूमिका ViewModel के लेने के लिए है Results संपत्ति:

private ObservableCollection<ICodeInspectionResult> _results; 

public ObservableCollection<ICodeInspectionResult> Results 
{ 
    get { return _results; } 
    set { _results = value; OnPropertyChanged(); } 
} 

... और इसे दो स्तरों पर समूहित करें - पहले InspectionType द्वारा, फिर Inspection द्वारा - परिणाम निरीक्षण प्रकार, निरीक्षण, और फिर व्यक्तिगत निरीक्षण परिणामों के साथ एक 3-स्तर पदानुक्रम है। इस बिंदु पर एक स्क्रीनशॉट visualizing मदद कर सकता है मुझे लगता है कि:

Rubberduck 2.0 Code Inspections toolwindow

तो, InspectionResultsTreeView की ItemTemplate, एक और बंद संसाधन है InspectionTypeGroupsTemplate के नाम से - कि बोल्ड "निरीक्षण प्रकार" आइटम है:

<HierarchicalDataTemplate x:Key="InspectionTypeGroupsTemplate" 
          DataType="{x:Type CollectionViewGroup}" 
          ItemsSource="{Binding Items}" 
          ItemTemplate="{StaticResource InspectionGroupsTemplate}"> 

    <StackPanel Orientation="Horizontal"> 
     <TextBlock VerticalAlignment="Center" 
        Text="{Binding Name}" 
        FontWeight="Bold" 
        TextWrapping="NoWrap"/> 
     <TextBlock Margin="4,0,4,0" 
        VerticalAlignment="Center" 
        Text="{Binding ItemCount, StringFormat=({0})}" 
        TextWrapping="NoWrap"/> 
    </StackPanel> 
</HierarchicalDataTemplate> 

और उस टेम्पलेट के ItemTemplate एक InspectionGroupsTemplate है - कि व्यक्तिगत निरीक्षण है, "गंभीरता" माउस के साथ:

<HierarchicalDataTemplate x:Key="InspectionGroupsTemplate" 
          DataType="{x:Type CollectionViewGroup}" 
          ItemsSource="{Binding Items}" 
          ItemTemplate="{StaticResource InspectionResultTemplate}"> 

    <StackPanel Orientation="Horizontal"> 
     <Image Style="{StaticResource IconStyle}" 
       Source="{Binding Name, Converter={StaticResource InspectionIconConverter}}" 
       VerticalAlignment="Center" /> 
     <TextBlock Margin="4" 
        VerticalAlignment="Center" 
        Text="{Binding Name, Converter={StaticResource InspectionDescriptionConverter}}" 
        TextWrapping="NoWrap"/> 
     <TextBlock Margin="0,4,0,4" 
        VerticalAlignment="Center" 
        Text="{Binding ItemCount, StringFormat=({0})}" 
        TextWrapping="NoWrap"/> 
    </StackPanel> 
</HierarchicalDataTemplate> 

अन्त में, इस समूह का ItemTemplate एक InspectionResultTemplate जो प्रत्येक व्यक्ति निरीक्षण परिणाम के लिए है,:

<DataTemplate x:Key="InspectionResultTemplate" 
       DataType="{x:Type inspections:ICodeInspectionResult}"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock VerticalAlignment="Center" 
        Margin="4" 
        Text="{Binding Name}" 
        TextWrapping="NoWrap"/> 
    </StackPanel> 
</DataTemplate> 

ICodeInspectionResult इंटरफ़ेस एक string Name संपत्ति है कि मैं यहाँ का उपयोग कर रहा है; यह NameName से अलग है जिसका उपयोग समूह स्तरों में किया जाता है, जहां यह object CollectionViewGroup.Name है - उस Name का अंतर्निहित प्रकार समूहकरण का है, इसलिए स्तर 1 InspectionType है, और स्तर 2 Inspection है।

समस्या यह है कि मैं इस कनवर्टर्स का उपयोग कर रहा हूं, मुझे विश्वास है कि मुझे यह object Name रूपांतरित करने के लिए और सदस्यों को एक्सेस करने की आवश्यकता है, जिन्हें मैं एक्सेस और प्रदर्शित करने की आवश्यकता है ... लेकिन फिर, मुझे संख्या प्रदर्शित करने की आवश्यकता है प्रत्येक समूह में आइटम DataTypeCollectionViewGroup होना चाहिए ... सही?

मैं इसे प्रदर्शित करने की आवश्यकता वाले सभी चीज़ों के लिए कनवर्टर का उपयोग किए बिना कैसे कर सकता हूं? यह कैसे किया जाना चाहिए किया जाना है? प्रत्येक TreeView/CollectionViewGroup ट्यूटोरियल जो मुझे मिल सकता है वह एक छोटा कार्यान्वयन था।

उत्तर

1

आपको XAML के साथ प्रतिष्ठित समस्या का सामना करना पड़ा है: यह लगभग भी संरचित है।

अधिकांश बेवकूफ समाधान एक कस्टम WPF उपयोगकर्ता नियंत्रण लिख रहा है। (इसमें आप और कैसे शामिल हैं आप ऊपर हैं।) डब्ल्यूपीएफ उपयोगकर्ता नियंत्रण का लक्ष्य डुप्लिकेट एक्सएएमएल मार्कअप और तर्क को खत्म करना है।आप उपयोगकर्ता नियंत्रण में अपना Converter शामिल कर सकते हैं और कन्वर्टर्स को अपने मुख्य नियंत्रण से हटा सकते हैं।

WPF में UserControl ऑब्जेक्ट्स बनाने पर बहुत सारे ट्यूटोरियल हैं, इसलिए मैं यहां विस्तार से नहीं जाऊंगा।


जहाँ तक Converter मुद्दे के रूप में: इस लगभग सबसे मुहावरेदार तरीका है। प्रत्येक कनवर्टर पुन: प्रयोज्य है, और केवल एक स्रोत प्रकार पर केंद्रित है। कन्वर्टर्स विलय करने पर विचार करने के अलावा, आप इसके बारे में और कुछ नहीं कर सकते हैं जो एक ही स्रोत प्रकार का समर्थन करते हैं। (कनवर्टर में Type targetType पैरामीटर और object parameter है।)

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