LINQ to SQL как источник привязки данных для WPF Treeview - PullRequest
0 голосов
/ 13 ноября 2009

Интересно, кто-нибудь может привести простой пример следующего. (желательно в VB.Net):

У меня есть база данных SQL со связанными таблицами, и я успешно использую LINQ to SQL в других областях моего приложения, но немного застрял с Heirarchical Treeview.

Я просто хотел бы использовать запрос LINQ из базы данных в качестве источника для WPF Treeview. Если я могу установить ItemsSource для древовидного представления в качестве результата LINQ и просто установить привязку данных для элементов древовидного списка к различным столбцам, из-за которых у меня будет день, но, похоже, я не смогу его приготовить.

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

Насколько я понимаю, отношения, определенные в файле DBML, должны оставаться неизменными при выполнении запроса LINQ. Итак, я могу иметь что-то вроде этого в качестве ItemsSource для Treeview?

Dim pdc As New ProjectDataContext()  
Public Property Selection() As Integer

Dim tree = From c In pdc.Customers _
           Where c.CustomerID = _Selection _
           Select c

projecttreeview.ItemsSource = tree

Тогда привязка данных для элементов TreeView может быть просто {Binding CustomerName) для родительского узла и сказать {Binding Orders.OrderName} в качестве дочернего узла. например:

<TreeView Name="projecttreeview">
  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Customers}">
      <TextBlock.Text="Binding CustomerName}"/>
        <HierarchicalDataTemplate.ItemTemplate>
          <DataTemplate>
            <TextBlock.Text="{Binding Orders.OrderName}"/>
          </DataTemplate>
        </HierarchicalDataTemplate.ItemTemplate>
      </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Очевидно, что это не совсем так просто, как хотелось бы. Любые указатели будут с благодарностью.

1 Ответ

0 голосов
/ 13 ноября 2009

Прежде всего, позвольте мне прояснить одну проблему, с которой вы, вероятно, столкнетесь: когда вы используете запрос в качестве ItemsSource, ItemsControl не будет отражать какие-либо изменения после повторного выполнения запроса, поэтому назначение ItemsSource для запроса очень похоже на присвоение его результату запроса, преобразованному в массив.

Во-вторых, чтобы получить доступ к связанным объектам / коллекциям (откуда бы вы ни делали это - будь то DataTemplate или просто простой код), вы должны явно указать это при создании запроса. В Entity Framework вы, вероятно, сделаете это с помощью метода Include, подобного следующему: treeview.ItemsSource = tree.Include("Orders") - это заставит механизм сделать JOIN SQL-запрос к базе данных.

...