2

我在 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,我可以拦截以修改显示?

4

3 回答 3

3

这篇博可能会有所帮助:

...我假设外键应该绑定到“SelectedValue”属性,并且有一个 ItemSource 可以绑定到我的事实表,以便填充下拉列表。

此时我的下拉菜单有效,但组合框中不会出现任何内容。我终于注意到了一个“SelectedItemPath”属性——我认为这将是下拉列表中与我的外键关联的字段的名称。果然,就是这样。

于 2008-10-12T07:07:07.933 回答
1

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

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

或类似的东西。请注意,您可能必须在“NameCst”的 .IdCst 设置器中包含 Notify Property Changed 事件。

另一种方法是编写一个 ValueConverter 来进行查找,但这对于如此简单的事情来说是相当沉重的。

于 2008-10-13T15:36:58.573 回答
-1

嘘!

我查看了此处的示例,从此处的其他帖子中挖掘了一些参考资料,并找到了答案... 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>

所以现在最重要的是,当我触发具有 Card Id 的事件时,我需要做的就是重置 CollectionViewSource ...

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

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

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

于 2008-10-23T18:48:45.517 回答