次のような基本的なクラスがあります。
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>
すべてのスライダーを互いに真下に配置したいのですが、そうでないことを除いて、それはうまく機能します。(階層の同じレベルにある人だけが互いの真下に表示されます)。
つまり、別の列にスライダー (「値」プロパティを表す) を表示するツリーが必要です。
誰か助けてくれませんか?