3

次のような基本的なクラスがあります。

public class Item
{
    private string      name;
    private bool        visible;
    private double      value;
    private Item        parent;
    private List<Item>  children = new List<Item>();
    …
}

ツリービューに表示する必要があるアイテムのリストがあります。アイテムごとに、次のフィールドを表示する必要があります。

  • チェックボックスとして「表示」
  • テキストブロックとしての「名前」
  • スライダーとしての「値」

MVVM を使用してこれを行いたいので、ツリービューをバインドする次のクラス「ItemViewModel」と「ItemCollectionViewModel」を定義しました。

次の XAML を試しました。

<TreeView ItemsSource="{Binding ItemViewModelList}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
            <Setter Property="FontWeight" Value="Normal" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="FontWeight" Value="Bold" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TreeView.ItemContainerStyle>

    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="VisibiltyCol" />
                    <ColumnDefinition SharedSizeGroup="NameCol" />
                    <ColumnDefinition SharedSizeGroup="ValueCol" />
                </Grid.ColumnDefinitions>
                <CheckBox  Grid.Column="0" IsChecked="{Binding Visible}"  Margin="5" />
                <TextBlock Grid.Column="1" Text="{Binding Name}" Margin="5" />
                <Slider    Grid.Column="2" Value="{Binding Value}" Width="100" Margin="10, 0, 0, 0" Maximum="1" />
            </Grid>

        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>

</TreeView>

すべてのスライダーを互いに真下に配置したいのですが、そうでないことを除いて、それはうまく機能します。(階層の同じレベルにある人だけが互いの真下に表示されます)。

つまり、別の列にスライダー (「値」プロパティを表す) を表示するツリーが必要です。

誰か助けてくれませんか?

4

1 に答える 1