2015-09-16 4 views
6

私はこのようになりますTreeViewCollectionViewGroupグループを持つ慣用的なXAML TreeViewは何ですか?

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

ItemsSourceInspectionTypeGroupViewSourceの名前で行く鍵付きのリソースです:

<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(); } 
} 

... 2レベルInspectionTypeによって、次にInspectionによって、検査結果、検査、および個々の検査結果を含む3レベルの階層が生成されます。スクリーンショットは、私が推測する可視化に役立つかもしれない。この時点で:

Rubberduck 2.0 Code Inspections toolwindow

ので、InspectionResultsTreeViewItemTemplateInspectionTypeGroupsTemplateの名前で、別のキー付きのリソースである - それは、大胆「検査タイプ」の項目です:

<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> 

そして、そのテンプレートのItemTemplateInspectionGroupsTemplateある - それは、「重要度」のアイコンで、個々の検査です:

<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性質を持っています。このNameはグループ化レベルで使用されているNameとは異なり、object CollectionViewGroup.Nameです。Nameの基になるタイプはグルーピングのものなので、レベル1はInspectionType、レベル2はInspectionです。

問題は、これを変換してアクセスして表示する必要があるメンバーにアクセスする必要があると思っているよりも多くのコンバーターを使用していることです...しかし、その後数を表示する必要があります各グループ内のアイテムはDataTypeCollectionViewGroup ...そうでしょうか?

どのように表示する必要があるすべてのコンバータを使用せずにこれを行うことができますか? はどのようにしてとしますか?すべてTreeView/CollectionViewGroupチュートリアル私は簡単な実装でした。

答えて

1

XAMLで象徴的な問題が発生しました。ほぼでもという構造になっています。

ほとんどイディオムの解決策は、カスタムWPFユーザーコントロールを作成しています。 WPFユーザーコントロールの目的は、重複したXAMLマークアップとロジックを排除することです。Converterをユーザーコントロールに含めることができ、メインコントロールからコンバータを削除することができます。

UserControlオブジェクトの作成に関するチュートリアルはWPFでたくさんありますので、ここでは詳しく説明しません。

限り Converter問題として

:これはほとんど最も慣用的な方法です。各コンバータは再利用可能で、1つのソースタイプにのみフォーカスします。同じソースタイプをサポートしているコンバータをマージすることを除けば、他にもできることはそれほどありません。 (コンバータにType targetTypeパラメータがあり、object parameterがある理由があります)

関連する問題