在过去,我不得不求助于使用数据集和数据表,因为使用绑定来做到这一点仍然让我困惑......
顶层:我在 VB 2012 中创建了一系列类,对它们进行了注释,并使用 Code First 在 EF6 中创建了 EF 模型。这个想法是表示路由器配置,配置的子部分是主要部分的子部分。非常简单的想法。
基本原理:使用简单的 WPF 树视图,说明配置部分和子部分(逻辑上)出现在路由器中的情况。
我非常简单地开始使用这些类,打算稍后使用 2 路绑定来更新每种方式等。以下是前 2 个顶级类(为简洁起见,进行了剪裁):
这是标准的 EF CodeFirst 费用,DBContext 由 EF 按照您的预期进行布局。这是顶级 2 级类(Access_Group 和 Access_List)的布局:
...EF-Land 一切都很好...
因为它可能很重要,所以这里是实际的 Access_Group 类:
Public Class Access_Group
Inherits EntityTypeConfiguration(Of Access_Group)
Implements IAccess_Group
<Key>
Public Property Access_GroupID As Integer Implements IAccess_Group.Access_GroupID
Public Property Name As String Implements IAccess_Group.Name
Public Property LastUpdated As Date Implements IAccess_Group.LastUpdated
Public Property Active As Boolean Implements IAccess_Group.Active
'------------------------------------------------------------------
Public Property Access_Lists As ObservableCollection(Of Access_List) Implements IAccess_Group.Access_Lists
Public Sub New()
Me.Access_Lists = New ObservableCollection(Of Access_List)
End Sub
End Class
有许多基于事件的组件我还没有添加,因为我只想在添加附加功能之前让基础功能发挥作用(在树视图中按层次结构显示)...
这就是在代码中创建类的方式,这些类首先填充数据库(SQL 2012):
[Window Class contd.]
Private Sub AddData()
Try
ctx = New entitiesContext
Dim d As Date = Now
'--------------------------------
Dim al As New Access_List
' lower classes not needed to be shown...
With al
.Active = True
.Checked = True
.LastUpdated = d
.Name = "some access-list at " & d.ToLongTimeString
End With
'--------------------------------
Dim ag As Access_Group = New Access_Group
With ag
.Access_Lists.Add(al)
.Active = True
.LastUpdated = d
.Name = "some access-group at " & d.ToLongTimeString
End With
'
ctx.Access_Groups.Add(ag)
'
Dim i As Integer = ctx.SaveChanges()
Console.WriteLine("Seed complete! -> " & i)
Catch ex As Exception
Dim exText As String = "Seed Failed "
Console.WriteLine(exText & "(Message): " & ex.Message)
Console.WriteLine(exText & "(ToString): " & ex.ToString)
Console.WriteLine(exText & "(StackTrace): " & ex.StackTrace)
Console.WriteLine("EntityValidationErrors: ")
For Each eve As System.Data.Entity.Validation.DbEntityValidationResult In ctx.GetValidationErrors()
Console.WriteLine("eve: OK? " & eve.IsValid & " - " & eve.Entry.ToString)
For Each devr As System.Data.Entity.Validation.DbValidationError In eve.ValidationErrors
Console.WriteLine("devr invalid property: " & devr.PropertyName)
Console.WriteLine("devr error message : " & devr.ErrorMessage)
Next
Next
End Try
End Sub
您会看到上面提到的 Access_List 作为第二层,这就是该类:
Public Class Access_List
Inherits EntityTypeConfiguration(Of Access_Group)
Implements toag.entities.IAccess_List
<Key>
Public Property Access_ListID As Integer Implements IAccess_List.Access_ListID
Public Property Name As String Implements IAccess_List.Name
Public Property LastUpdated As Date Implements IAccess_List.LastUpdated
Public Property Active As Boolean Implements IAccess_List.Active
Public Property Checked As Boolean Implements IAccess_List.Checked
Public Property Object_Groups As ObservableCollection(Of Object_Group) Implements IAccess_List.Object_Groups
Public Sub New()
Me.Object_Groups = New ObservableCollection(Of Object_Group)
End Sub
End Class
如果我能弄清楚如何让这两个类发挥作用,我就可以模板化并让其余的类也这样做......
我已经尝试了数百种代码和 XAML 组合,所以我将选择至少显示的一种某物在树视图上:
<TreeView Grid.Column="0"
x:Name="ACLTreeView"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
ItemsSource="{Binding Access_Group}">
</TreeView>
当此 XAML 与此代码隐藏组合时:
Public Class ConfigWindow
Property ctx As entitiesContext
Public Access_Group_List As IEnumerable(Of Access_Group)
Sub New()
' This call is required by the designer.
InitializeComponent()
Startup()
End Sub
Public Sub Startup()
Try
ctx = New vASAContext
Me.Access_Group_List = From ag In ctx.Access_Groups Select ag
Me.ACLTreeView.ItemsSource = Access_Group_List.ToList
Catch ex As Exception
Debug.Print("ex: " & ex.Message)
End Try
End Sub
End Class
将产生以下结果:
(抱歉不得不混淆命名空间......)这很好,因为 XAML 中没有 HierarchicalTemplate 甚至 TreeViewItem。
这是修改后的 XAML:
...这将显示 Access_Group 实体的 Name 属性,而不是它的类名 [编辑帖子时无法添加它的屏幕截图,因此您可能必须相信我! :)]
但是 Window 类中的另一个子项指出了层次结构可能无法被识别的问题。难道是我一直在尝试正确的示例,而我的 EF 类设置不正确?该子项应显示所有元素及其子元素:
Public Sub PrintDebug(TheList As IEnumerable(Of Access_Group))
For Each ag As Access_Group In TheList
Console.WriteLine("=======================================")
Console.WriteLine("ag: " & ag.Name & " has " & ag.Access_Lists.Count & " Access_List entries")
For Each al As Access_List In ag.Access_Lists
Console.WriteLine("ag -> al: " & al.Name & " has " & al.Object_Groups.Count & " Object_Group entries")
For Each og As Object_Group In al.Object_Groups
Console.WriteLine("ag -> al -> og: " & og.Name & " has " & og.Network_Objects.Count & " Network_Object entries")
'...
Next
Next
Console.WriteLine("=======================================")
Next
End Sub
但这就是调试类输出的内容:
=======================================
ag: some access-group at 5:00:49 PM has 0 Access_List entries
=======================================
=======================================
ag: some access-group at 5:08:56 PM has 0 Access_List entries
=======================================
=======================================
ag: some access-group at 5:09:14 PM has 0 Access_List entries
=======================================
=======================================
ag: some access-group at 5:12:31 PM has 0 Access_List entries
=======================================
[...]
?这是否意味着我的 Treeview 没有机会?但是,但是...数据库中的数据是正确的:
当我使用上面的代码时,所有这些键都由 EF 填充(仅在填充 ObservableCollections 后保存顶级类 (Access_Group)...)
???
我已经尝试了 HierarchicalTemplate 的每种组合、网格/窗口资源、嵌套等。三天后我又回到了方 1...:) 是的,还有各种 LINQ 查询...现在我正在考虑 SQL (GASP)或 LINQ/SQL 中的 JOIN,但如果我准备好真正放弃的话,我也可能会一直回到 DataSets 和 DataTables...
感谢任何帮助...我只是无法继续,直到我能让这些实体正确绑定...