如何使用WPF数据绑定处理外键?

时间:2008-10-12 06:21:00

标签: wpf data-binding

我在WPF中有一个ListView,它被数据绑定到我从数据库中提取的基本表。 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 个答案:

答案 0 :(得分:2)

此博客post可能有所帮助:

  

...我假设外键应绑定到'SelectedValue'属性,   并且我可以使用ItemSource   绑定到我的事实表,所以下拉   已填充。

     

此时我的下拉工作正常,但是   组合框中没有任何东西出现。   我终于注意到'SelectedItemPath'了   财产 - 我以为这将是   我的下拉列表中的字段名称   与我的外键相关联。当然   够了,这就是它的本质。

答案 1 :(得分:1)

我会在您的基础类中添加一个新属性:

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

或类似的东西。请注意,您可能必须在.IdCst setter中为“NameCst”添加Notify Property Changed事件。

另一种方法是编写一个执行查找的ValueConverter,但这对于这么简单的事情来说非常重要。

答案 2 :(得分:-1)

BOO YAH !!!

我在这里查看了这些示例,从这里的其他帖子中挖掘了一些参考文献,并找到了答案... 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>

所以现在最重要的是当我触发一个具有卡ID的事件时,我需要做的就是重置设置CollectionViewSource ......

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

... WPF的所有绑定元素都会完成其余的工作!

好处是我可以轻松创建其他转换器,将它们添加到应用程序中其他位置的各种DataTemplates或列中,一旦我将所有数据都放入WPF应用程序本身,转换就可以在不进行的情况下进行到数据库。

相关问题