Re: WPF Binding, связанные таблицы
От: Peter Fleischer Германия www.informtoools.de
Дата: 18.05.10 05:56
Оценка: 3 (1)
"OldEthereal" <12722@users.rsdn.ru> schrieb im Newsbeitrag
news:3806091@news.rsdn.ru...
> Добрый вечер.
>
> Подскажите, как организовать вывод вместо айди имени из родительской
> таблицы. Читал все, что нашел похожего, но так ничего и не понял.
> Имеем датасет с двумя таблицами, например, employee(id, first_name,
> last_name, firm_id) и firm(id, firm_name). Есть соответствующий foreign
> key в таблице employee.
> Таблица employee привязана к ListView, в нем GridView и созданы
> GridViewColumn для каждой колонки. Как в колонке для поля firm_id вывести
> firm_name?
>
> Датасет не strong typed. Сделать все нужно не в XAML, а в коде. Меня бы
> удовлетворило даже решение типа Path=Row.firmRow, но не типизированный
> датасет. Никак не соображу

Самое простое решение "expression column", напр. так:

[XAML]
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" xmlns:my="clr-namespace:WpfApplication1"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase">
<Window.Resources>
<my:ViewModel x:Key="vm" />
<CollectionViewSource Source="{Binding Source={StaticResource vm},
Path=DT}" x:Key="cvs">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="master"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
<DataTemplate x:Key="dt">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding colC}"/>
<TextBox Text="{Binding master, Mode=OneWay}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<StackPanel DataContext="{Binding Source={StaticResource vm}}">
<ListView ItemsSource="{Binding Source={StaticResource cvs}}"
ItemTemplate="{Binding Source={StaticResource dt}}" />
</StackPanel>
</Window>
[/XAML]

ViewModel:

Imports System.Data

Public Class ViewModel

  Private m As New Model

  Public Sub New()
    ' Add relation
    m.DS.Relations.Add(New DataRelation("rel1", 
m.DS.Tables("Master").Columns("ID"), m.DS.Tables("Child").Columns("FK")))
    ' Add expression column
    m.DS.Tables("Child").Columns.Add("master", GetType(String), 
"parent(rel1).colM")
    ' Set Property DT
    DT = m.DS.Tables("Child")
  End Sub

  Public Property DT As DataTable

End Class


Model

Imports System.Data

Public Class Model

  Public Property DS As New DataSet

  Public Sub New()
    ' Generate Master-Demo-records
    DS.Tables.Add(New DataTable("Master"))
    With DS.Tables("Master")
      With .Columns
        With .Add("ID", GetType(Integer))
          .AutoIncrement = True
          .AutoIncrementSeed = 1
          .AutoIncrementStep = 1
        End With
        .Add("colM", GetType(String))
      End With
      For i = 1 To 9
        Dim r As DataRow = .NewRow
        r.Item("colM") = "Master " & i.ToString
        .Rows.Add(r)
      Next
    End With
    ' Generate Child-Demo-records
    DS.Tables.Add(New DataTable("Child"))
    With DS.Tables("Child")
      With .Columns
        With .Add("ID", GetType(Integer))
          .AutoIncrement = True
          .AutoIncrementSeed = 1
          .AutoIncrementStep = 1
        End With
        .Add("FK", GetType(Integer))
        .Add("colC", GetType(String))
      End With
      Dim rnd As New Random
      For i = 1 To 20
        Dim r As DataRow = .NewRow
        r.Item("FK") = rnd.Next(1, 9)
        r.Item("colC") = "Child " & i.ToString
        .Rows.Add(r)
      Next
    End With
  End Sub

End Class


--
Peter
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.