Привязка элемента к TreeView SelectedItem, где TreeViewItem имеет ItemsSource

У меня есть следующий UserControl:

      <UserControl x:Class="ConcreteAnalyzer.Views.CenterSectionPropertiesView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:c="clr-namespace:ConcreteAnalyzer.Converters"
         xmlns:local="clr-namespace:ConcreteAnalyzer.Views"
         xmlns:vm="clr-namespace:ConcreteAnalyzer.ViewModels.CenterSection"
         mc:Ignorable="d">
<UserControl.Resources >
    <c:DebugConverter x:Key="DebugConverter"/>
</UserControl.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="8"/>
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>
    <TreeView Grid.Row="0" x:Name="CenterSectionTree">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type vm:PanViewModel}">
                <TreeViewItem Header="Pan"/>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
        <TreeViewItem Header="Center Section" DataContext="{Binding CenterSection}">
            <TreeViewItem Header="Front" DataContext="{Binding XPositive}" ItemsSource="{Binding Pans, Converter={StaticResource DebugConverter}}"/>
            <TreeViewItem Header="Back" DataContext="{Binding XNegative}" ItemsSource="{Binding Pans}"/>
            <TreeViewItem Header="Left" DataContext="{Binding YPositive}" ItemsSource="{Binding Pans}"/>
            <TreeViewItem Header="Rigth" DataContext="{Binding YNegative}" ItemsSource="{Binding Pans}"/>
        </TreeViewItem>
    </TreeView>
    <GridSplitter Grid.Row="1" Height="8" ResizeDirection="Rows" HorizontalAlignment="Stretch" ResizeBehavior="PreviousAndNext">
        <GridSplitter.Template>
            <ControlTemplate TargetType="{x:Type GridSplitter}">
                <Grid>
                    <Button Content="⁞" Background="Transparent" Foreground="White"/>
                    <Rectangle Fill="{StaticResource TurqoiseBrush}"/>
                </Grid>
            </ControlTemplate>
        </GridSplitter.Template>
    </GridSplitter >
    <ContentControl Content="{Binding SelectedItem.DataContext, ElementName=CenterSectionTree, Converter={StaticResource DebugConverter}}" Grid.Row="2">
        <ContentControl.Resources>
            <DataTemplate DataType="{x:Type vm:CenterSectionViewModel}">
                <TextBlock Text="Center Section"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:WallViewModel}">
                <TextBlock Text="Wall"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:PanViewModel}">
                <TextBlock Text="Pan"/>
            </DataTemplate>
        </ContentControl.Resources>
    </ContentControl>
</Grid>

Это отлично работает для элементов Treeview, которые жестко запрограммированы, но если я выберу одну из панелей, ElementBinding не подключится. Я мог бы изменить древовидное представление, чтобы использовать HiearchicalDataTemplate, но для этого, я думаю, мне нужно создать фиктивные коллекции для привязки на каждом уровне, а также добавить свойство к стенам, чтобы я мог сказать, какая стена является какой. Создание всей этой фиктивной информации только для того, чтобы дерево работало, для меня имеет некоторый запах кода.

Есть мысли о том, как лучше всего заставить это работать?

редактировать:

Причина, по которой он не работает, заключается в том, что когда жестко заданные элементы древовидного представления выбираются, точки привязки данных находятся в самом TreeViewItem, и поэтому я привязался к SelectedItem.DataContext. Когда вы выбираете Pan, SelectedItem является PanViewModel, а не TreeViewItem.

Если я попробую просто привязать к SelectedItem, жестко запрограммированные TreeViewItems не будут работать, потому что они попытаются внедрить сам TreeViewItem в ContentControl, что вызовет исключение.

Привязка к SelectedItem.DataContext не будет работать, потому что PanViewModel не имеет DataContext. Я до сих пор не вижу элегантного решения этой проблемы.

0 ответов

Другие вопросы по тегам