1

モデルに 2 つのテーブルがあり、1 つのテーブルには、1 対多の関係で他のテーブルに関連するエントリが含まれています。次に例を示します。

Table User
  ID
  Name

Table Comments
  ID
  UserID
  Title
  Text

ユーザー名を含むテキスト列と、ユーザーが作成したすべてのコメントを表示するコンボボックスを含むもう 1 つの列の 2 つの列を持つ WPF ウィンドウにデータグリッドを表示したいと考えています。

データグリッドの定義は次のようになります。

        <DataGrid AutoGenerateColumns="False" [layout options...] Name="dataGrid1" ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
            <DataGridComboBoxColumn Header="Comments"
                SelectedValueBinding="{Binding Path=UserID}"
                SelectedValuePath="ID"
                DisplayMemberPath="Title"
                ItemsSource="{Binding Path=Comments}"
                />
        </DataGrid.Columns>
    </DataGrid>

コードでは、次のように DataContext を割り当てます。

dataGrid1.DataContext = entities.Users;

エンティティ User には、ユーザーが作成したすべてのコメントにつながる Comments という名前のプロパティがあります。クエリはデータを返し、ユーザー名は表示されますが、コンボボックスは入力されていません。

アプローチが完全に間違っているか、ここで非常に単純な点が欠けているだけかもしれません。これを行うためのより良い方法を学ぶために開かれています。

ありがとう

4

1 に答える 1

1

私は実際にあなたのアプローチをすでに使用しました。これは機能しますが、注意が必要です。コンボボックスは、許可された値のリスト(ここentities.Users)にある場合にのみ、特定のオブジェクトの現在のアイテムを表示できます。

Users「はい、でもそうです!リスト全体に入れました」と言うでしょう。悲しいことに、そうではありません。EF内のエンティティのデフォルトの比較は、EntityKeysに基づいていません(私の推測では、これはデフォルトの比較、つまり参照比較です)。したがって、オブジェクトには1つのオブジェクトへの参照があり、リストにはabdがあります。別の参照(両方に同じEntityKeyを使用)。

User私の解決策は、ID == IDの簡単なチェックで、クラスの比較関数をオーバーライドすることです。これが最善のアプローチであると言っているわけではないことに注意してください(たとえば、コードの残りの部分に望ましくない結果をもたらす可能性があります)。

ああ、一般的な推奨事項は、コントロールをIQueriablesに直接バインドするのではなく、Execute関数の結果にバインドすることです(そうでない場合、クエリはデータベースに対して2回実行されます) 。詳細については、 msdnを参照してください。

于 2010-05-14T15:46:34.793 に答える