BOO YAH !!!
J'ai regardé les échantillons ici, j'ai extrait quelques-unes des références d'autres publications ici, et j'ai trouvé la réponse ... IValueConverter ... une interface qui peut être utilisée avec WPF pour convertir les valeurs au point de contraignant. C'est un peu difficile à mettre en place au début, mais pas si difficile.
La première étape consiste à créer une classe de recherche ou de conversion simple qui implémente l'interface IValueConverter. Pour ma solution, je l'ai fait:
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
Note: Je ne suis pas la méthode en utilisant ConvertBack, mais il est requis par l'interface.
De là, vous devez ajouter une référence à l'espace de noms dans votre section d'en-tête 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">
Puis dans Windows.section Ressources, vous pouvez référencer le convertisseur, et dans mon cas, je créé une référence statique au CollectionViewSource qui stockera les données:
<Window.Resources>
<CollectionViewSource Source="{Binding Source={x:Static Application.Current}, Path=CardDetails}" x:Key="CardDetails">
</CollectionViewSource>
<c:SetIdToNameConverter x:Key="SetConverter"/>
</Window.Resources>
Puis finalement, dans la ListView qui faisait partie du problème initial, vous ajoutez la référence du convertisseur:
<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>
Ainsi, la grande partie est maintenant que lorsque je déclenche un événement qui a une carte d'identité, tout ce que je dois faire est remis à zéro régler le CollectionViewSource ...
DirectCast(Me.FindResource("CardDetails"), CollectionViewSource).Source = taCardDetails.GetDataById(CardId)
... et tous les éléments de liaison de WPF font le reste! Ce qui est bien, c'est que je peux facilement créer d'autres convertisseurs, les ajouter à divers DataTemplates ou colonnes ailleurs dans l'application, et une fois toutes les données dans l'application WPF, les conversions peuvent être effectuées sans aller à la base de données.
Remarque rapide. J'ai trouvé que compiler la classe de convertisseur avant d'ajouter tout le code de XAML semble aider à éliminer certains des "nags" qu'il vous donnera jusqu'à ce que tout soit compilé ensemble. –
Désolé d'éclater votre bulle, mais ce convertisseur va frapper la base de données au moins une fois pour chaque ligne. –
True true. Cependant, c'est actuellement pour un petit ensemble qui remplit certains codes de recherche. Pour un travail plus important, je fais certainement de l'optimisation, ou des données en cache locales pour minimiser ce genre d'impact. Mais c'est bon à se souvenir, merci. –