WPF层次树视图:自引用层次结构和平面源的组合绑定

问题描述 投票:0回答:1

[最近,我对MVVM /绑定/ Entityframework等了解了很多。而且,我一直很努力地工作-我使用VB.NET-必须将找到的大多数代码从C#转换为VB.NET;)所以,我的主题是:

完整标题:

WPF层次树视图:使用EntityFramework 6和数据库优先方法对自引用层次源和平面源的组合绑定和模板化。

DataModel:

图像:https://i.stack.imgur.com/LIb1v.png

期望的树状视图

我有两种类型的物品:

  • “维度”来自自引用来源(XELL_DIMENSION)和分层项目。未知/未打开Leveldepth。
  • “ Elements”来自固定来源(XELL_ELEMENTS)a

图像:https://i.stack.imgur.com/QeFwe.png

确定,这是我到目前为止所取得的成就:

Mainwindow Class:

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        Dim elementsContext As New XELLEntities()
        Tree.DataContext = elementsContext.XELL_DIMENSION.Include("XELL_ELEMS").ToList()
        Tree.ItemsSource = elementsContext.XELL_DIMENSION.Where(Function(y) y.DIMEN_PARENT_ID Is Nothing).ToList()
End Sub        

XAML代码:

 <TreeView Name="Tree" HorizontalAlignment="Left" Height="187" Margin="10,10,0,0" VerticalAlignment="Top" Width="415">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type local2:XELL_DIMENSION}" ItemsSource="{Binding DIM_ALL_NODE}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding DIMEN_ID}"/>
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="{Binding DIMEN_BEZ_LONG}"/>
                            <ListBox Name="Listy" ItemsSource="{Binding XELL_ELEMS}" DisplayMemberPath="ELEM_BEZ_LONG" BorderBrush="Transparent" BorderThickness="0"/>
                        </StackPanel>                            
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.Resources>                           
        </TreeView>

结果:

问题:

所以这是我最近到达的地方,我为元素使用了一个列表框-但这是对我来说不是解决办法。

-我如何解决我的问题?

感谢提供的任何CodeSnipped。

wpf entity-framework treeview hierarchical-data hierarchicaldatatemplate
1个回答
1
投票

尤里卡! -已解决

我必须使用Converter和TemplateSelector。

XAML:

<TreeView Name="Tree" HorizontalAlignment="Left" Height="187" Margin="10,10,0,0" VerticalAlignment="Top" Width="415"> <TreeView.Resources>
            <local3:LeafDataTemplateSelector x:Key="LeafDataTemplateSelector" />
            <HierarchicalDataTemplate  DataType="{x:Type local2:XELL_DIMENSION}" ItemTemplateSelector="{StaticResource LeafDataTemplateSelector}">
                <HierarchicalDataTemplate.ItemsSource>
                    <MultiBinding Converter="{StaticResource SimpleFolderConverter}">
                        <Binding Path="DIM_ALL_NODE" />
                        <Binding Path="XELL_ELEMS" />
                    </MultiBinding>
                </HierarchicalDataTemplate.ItemsSource>
                <StackPanel Orientation="Horizontal">
                    <Image HorizontalAlignment="Center" Height="20" VerticalAlignment="Center" Width="20" Source="MVVM/VIEW/IMAGES/Nodes.png" Stretch="Uniform" />
                    <TextBlock Foreground="#FF3399FF" Text="{Binding DIMEN_BEZ_LONG}" FontWeight="Bold"/>
                </StackPanel>
            </HierarchicalDataTemplate> <HierarchicalDataTemplate x:Key="Dimension" DataType="{x:Type local2:XELL_DIMENSION}" ItemTemplateSelector="{StaticResource LeafDataTemplateSelector}">
                <HierarchicalDataTemplate.ItemsSource>
                    <MultiBinding Converter="{StaticResource SimpleFolderConverter}">
                       <Binding Path="XELL_ELEMS" />
                        <Binding Path="DIM_ALL_NODE" />
                    </MultiBinding>
                </HierarchicalDataTemplate.ItemsSource>
                <StackPanel Height="25" Orientation="Horizontal" ToolTip="Installation File">
                    <Image HorizontalAlignment="Center" Height="20" VerticalAlignment="Center" Width="20" Source="MVVM/VIEW/IMAGES/Nodes.png" Stretch="Uniform" />
                    <TextBlock Foreground="#FF3399FF" Text="{Binding DIMEN_BEZ_LONG}" FontWeight="Bold"/>
                </StackPanel>
            </HierarchicalDataTemplate> <DataTemplate x:Key="Element" DataType="{x:Type local2:XELL_ELEMENT}">
                <StackPanel Height="25" Orientation="Horizontal" ToolTip="Installation File">
                    <Image HorizontalAlignment="Center" Height="20" VerticalAlignment="Center" Width="20" Source="MVVM/VIEW/IMAGES/Shape57.png" Stretch="Uniform" />
                       <TextBlock Foreground="DarkGray" Text="{Binding ELEM_BEZ_LONG}" FontWeight="Normal" FontStyle="Italic"/>
                </StackPanel>
            </DataTemplate>
        </TreeView.Resources>
    </TreeView>

VB.NET-MainWindow

    Public Sub New()
        ' Dieser Aufruf ist für den Designer erforderlich.
        InitializeComponent()

        ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.

    End Sub

     Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

        Dim elementsContext As New XELLEntities()
        Tree.DataContext = elementsContext.XELL_DIMENSION.Include("XELL_ELEMS").ToList()
        Tree.ItemsSource = elementsContext.XELL_DIMENSION.Where(Function(y) y.DIMEN_PARENT_ID Is Nothing).ToList()


    End Sub

VB.NET TemplateSelection] >>

    Public Class LeafDataTemplateSelector
    Inherits DataTemplateSelector
    Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
        Dim element As FrameworkElement = TryCast(container, FrameworkElement)

        If element IsNot Nothing AndAlso item IsNot Nothing Then

            If TypeOf item Is XELL_DIMENSION Then
                Return TryCast(element.FindResource("Dimension"), DataTemplate)
            ElseIf TypeOf item Is XELL_ELEMENT Then
                Return TryCast(element.FindResource("Element"), DataTemplate)
            End If
        End If

        Return Nothing
    End Function
End Class

VB.NET层次结构转换器

Class HierarchyConverter : Implements IValueConverter
    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert
        Dim node = TryCast(value, Employee)
        If node IsNot Nothing Then
            Return node.Subordinates.Where(Function(i) i.ManagerID = node.EmployeeID).ToList()
        Else
        End If
    End Function 
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
        Throw New NotSupportedException
    End Function End Class

希望这对某人有帮助;)

© www.soinside.com 2019 - 2024. All rights reserved.