2009-11-13 5 views
0

Интересно, может ли кто-нибудь предоставить простой пример следующего. (желательно в VB.Net):LINQ to SQL как источник привязки данных для WPF Treeview

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

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

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

Насколько я понимаю, отношения, определенные в файле DBML, остаются неизменными при выполнении запроса LINQ. Итак, могу ли я иметь что-то вроде этого как ItemSource для 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> 

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

ответ

0

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

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

+0

P.S. Я действительно не знаю LINQ to SQL, поэтому вам нужно прочитать MSDN для правильного метода, чтобы включить связанный объект, но «указатель» был дан :) – archimed7592

+0

Спасибо за подсказку, У меня было ощущение, что есть проблема с другими таблицами, которые не отображаются должным образом. Исследование наилучшего способа использования оператора «Включить», который, кажется, немного минного поля его собственного ... – yimbot

+0

Посмотрите на тему «Отношения» в [this] (http://msdn.microsoft.com/en-us/library /bb425822.aspx#linqtosql_topic11) учебник - есть примеры, как это сделать. Что-то вроде этого: DataShape ds = new DataShape(); ds.LoadWith (c => c.Orders); db.Shape = ds; var q = от c в db.Customers где c.City == "London" select c; HTH. – archimed7592