Как мне обрабатывать внешние ключи с помощью привязки данных WPF? - PullRequest
2 голосов
/ 12 октября 2008

У меня есть ListView в WPF, который привязан к базовой таблице, которую я извлекаю из базы данных. Код для ListView выглядит следующим образом:

<ListView Canvas.Left="402" Canvas.Top="480" Height="78" ItemsSource="{Binding}" Name="lsvViewEditCardPrint" Width="419">
   <ListView.View>
      <GridView>
         <GridViewColumn DisplayMemberBinding="{Binding Path=IdCst}">Set</GridViewColumn>
         <GridViewColumn DisplayMemberBinding="{Binding Path=Language}">Language</GridViewColumn>
         <GridViewColumn DisplayMemberBinding="{Binding Path=Number}">Number</GridViewColumn>
         <GridViewColumn DisplayMemberBinding="{Binding Path=IdArt}">Artwork</GridViewColumn>
      </GridView>
   </ListView.View>
</ListView>

Столбец IdCst является внешним ключом отдельной таблицы, и я хотел бы отобразить поле фактического имени из этой таблицы, а не только Id. Кто-нибудь знает, как установить привязку данных, или есть событие, такое как OnItemDataBound, которое я мог бы перехватить, чтобы изменить отображение?

Ответы [ 3 ]

2 голосов
/ 12 октября 2008

Этот блог пост может помочь:

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

В этот момент мой выпадающий сработал, но ничего не появится в выпадающем списке. Я наконец заметил "SelectedItemPath" собственность - я предположил, что это будет Название поля в моем раскрывающемся списке был связан с моим внешним ключом. Конечно достаточно, это именно то, что есть.

1 голос
/ 13 октября 2008

Я бы добавил новое свойство в ваш базовый класс:

Public ReadOnly Property NameCst() as String
    Get
        Return Names.LookupName(Me.IdCst)
    End Get
End Property

или что-то подобное. Обратите внимание, что вам, вероятно, придется включить событие Notify Property Changed в ваш установщик .IdCst для "NameCst".

Альтернативой является написание ValueConverter, который выполняет поиск, но это довольно тяжелый вес для чего-то такого простого.

0 голосов
/ 23 октября 2008

БУ ЯХ !!!

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

Первым шагом является создание простого класса поиска или конвертера, который реализует интерфейс IValueConverter. Для моего решения я сделал это:

Namespace TCRConverters

   Public Class SetIdToNameConverter
      Implements IValueConverter

      Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
         Dim taCardSet As New TCRTableAdapters.CardSetTableAdapter
         Return taCardSet.GetDataById(DirectCast(value, Integer)).Item(0).Name
      End Function

      Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
         Return Nothing
      End Function

   End Class

End Namespace

Примечание. Я не использую метод ConvertBack, но это требуется интерфейсом.

Оттуда вам нужно добавить ссылку на пространство имен в разделе заголовка XAML:

<Window x:Class="Main" Loaded="Main_Loaded"
    // Standard references here...
    xmlns:c="clr-namespace:TCR_Editor.TCRConverters"
    Title="TCR Editor" Height="728" Width="1135" Name="Main">

Затем в разделе Windows.Resources вы можете ссылаться на конвертер, и в моем случае я создал статическую ссылку на CollectionViewSource, который будет хранить данные:

<Window.Resources>
   <CollectionViewSource Source="{Binding Source={x:Static Application.Current}, Path=CardDetails}" x:Key="CardDetails">         
   </CollectionViewSource>

   <c:SetIdToNameConverter x:Key="SetConverter"/>      
</Window.Resources>

Затем, наконец, в ListView, который был частью первоначальной проблемы, вы добавляете ссылку на конвертер:

<ListView Canvas.Left="402" Canvas.Top="480" Height="78" ItemsSource="{Binding}" Name="lsvViewEditCardPrint" Width="419">
   <ListView.View>
      <GridView>
         <GridViewColumn DisplayMemberBinding="{Binding Path=IdCst, Converter={StaticResource SetConverter}}">Set</GridViewColumn>
         // Other Columns here...
      </GridView>
   </ListView.View>
</ListView>

Итак, самое замечательное в том, что когда я запускаю событие с идентификатором карты, все, что мне нужно сделать, это сбросить настройку CollectionViewSource ...

DirectCast(Me.FindResource("CardDetails"), CollectionViewSource).Source = taCardDetails.GetDataById(CardId)

... и все обязательные элементы WPF делают все остальное!

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...