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>

したがって、カード ID を持つイベントをトリガーすると、CollectionViewSource の設定をリセットするだけで済みます...

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

...そして、WPF のすべてのバインディング要素が残りを行います!

良い点は、他のコンバーターを簡単に作成し、それらをアプリケーションの別の場所にあるさまざまな DataTemplates または列に追加できることです。すべてのデータを WPF アプリ自体に取り込めば、データベースにアクセスせずに変換を実行できます。 .

于 2008-10-23T18:48:45.517 に答える