2009-05-26 11 views
1

TreeViewがあり、階層型ではないネストされたデータを表示したいと考えています。第1レベルのデータはTaskViewModel、第2レベルのデータはArtifactViewModelです。私はTaskViewModelを表すGroupBoxの内部にArtifactViewModelの水平を入れたいと思います。 私は別のアプローチを試みたが、これが私の最後のいずれかになります。そのArtifactViewModel sは縦示しているほかControlTemplateをビルドする必要はありますか?あるいは代替手段がありますか?

<TreeView Name="tvTasks" ItemsSource="{Binding Tasks}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type vm:TaskViewModel}"> 
      <GroupBox Header="{Binding Name, UpdateSourceTrigger=PropertyChanged}"> 
       <StackPanel Orientation="Vertical"> 
        <ListView ItemsSource="{Binding Children}"/> 
        <TextBlock Text="{Binding Description, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"/> 
       </StackPanel> 
      </GroupBox> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="{x:Type vm:ArtifactViewModel}"> 
      <Border Background="{Binding Type,Converter={StaticResource Type2Background}}" 
        Margin="5" BorderBrush="Black" BorderThickness="2" CornerRadius="2"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="80"/> 
         <RowDefinition Height="20"/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="100"/> 
        </Grid.ColumnDefinitions> 
        <TextBlock Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" 
           TextAlignment="Center" Background="Black" Foreground="White" 
           Opacity="0.75" Grid.Column="0" Grid.Row="1"/> 
       </Grid> 
      </Border> 
     </DataTemplate>           
    </TreeView.Resources> 
</TreeView> 

これは、ほとんど私が欲しいもののように見えます。 ArtifactViewModelをクリックすると、ListViewがこのイベントを通知するため、tvTasks.SelectedItemは変更されません。私はこのアプローチが賢明ではないことを知っていますが、それは単なる試みです。
私はthis articleを見ましたが、私はTreeViewに入れたいさまざまなオブジェクトをどのように処理するのか分かりません。だから...私はどのようにそのようなUIを構築するのですか?

答えて

0

ここで実行している主な問題は、それぞれ独自の選択項目を持つ複数のコントロールを入れ子にすることです。

データをネストされているが階層的でないと表示する予定がある場合は、TreeViewを使用してください。任意の時点で1つの項目を選択可能にしたい場合は、代わりにListBoxを使用します。

ここで、物事をどのようにレイアウトしたいのかと厄介な部分が遊んでいます。 Bea Stollnitzの例hereを見て、ListBoxをキャンバスとして再描画します。 ItemsPanelTemplateがCanvasで、x、y座標を計算するのと似たようなことができます。また、Gridを使用してGrid.RowとGrid.Columnの値を決定することもできます。

+0

あなたの答えをありがとうが、私はそれが私を助けるとは思わない。私はTreeViewとSelectedItemプロパティにバインドされているこのアプリケーションのContentPresenterinも持っています。私の以前の試みの1つはListView(TreeViewなし)であり、うまくいきませんでした。 –

+1

幸運。しかし、ネストされた選択コントロールを使用する限り、問題にぶつかると思います。厳密に1つの選択コントロールが必要になり、DataTemplatesを使用して配置/レイアウト作業を行います。 – micahtan

関連する問題