1

この段階ではおそらく完全な MVVM を必要としない WPF データ アクセス レイヤーを作成しています (ただし、実装する可能性はあります)。

CollectionViewSource をデータ ソースとして使用して、関連テーブルの外部キー値にデータをバインドする ComboBox を正常に作成しました (以下の XAML を参照してください。コンボ ボックスは正常に動作しますが、TextBlock は動作しません)。

ComboBox をセル編集テンプレートとして表示し、編集されていないときにデータを表示するために TextBlock を使用したいだけです。TextBlock をほぼ機能させることができます (外部キーに関連するテーブルのデータが表示されます) が、「SelectedValuePath」に相当するプロパティが見つからないため、TextBlock は常に、関連するテーブルの最初の値ではなく、関連するテーブルの最初の値を表示します。外部キー フィールドの ID に対応する値。

ComboBox にあるのと同じように、TextBlock から同等の動作を取得する方法はありますか (存在する必要があります)。SelectedValuePath に相当するプロパティはありますか?

ユーザーに編集機能を提供せずにデータグリッドに表示したい他のフィールドがいくつかあるため、この質問への回答は非常に役立ちますが、外部キーIDではなく関連テーブルからフィールドを表示したい.

あなたの助けを前もって本当にありがとう、そして素晴らしい一日を!

<CollectionViewSource x:Key="QGradeLookup"/>

                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock
                            Text="{Binding Source={StaticResource QGradeLookup}, Path=QGrade}"
                            >
                        </TextBlock>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>

                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox
                            IsEditable="False"
                            ItemsSource="{Binding Source={StaticResource QGradeLookup}}"
                            DisplayMemberPath="QGrade"
                            SelectedValuePath="ID"
                            SelectedValue="{Binding Path=OfficeQualityGradeID}"
                            IsSynchronizedWithCurrentItem="False"
                            >
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>

            </DataGridTemplateColumn>

要求されたとおり、アイテムのソースのコードは次のとおりです (NIT に感謝):

Dim QGradeLookup As CollectionViewSource
Dim QGradeList = From q In OMRInterfaceEntities.OfficeQualityGrades
Dim QGsource = CType(Me.FindResource("QGradeLookup"), CollectionViewSource)
QGsource.Source = QGradeList.ToList()

上記のテンプレートとして Beth Massi の投稿を使用しました - Beth Massi's Template

そして、ここにコードビハインドがあります

Public Class WinPropertyDataEntry

Dim QGradeLookup As CollectionViewSource

Private Function GetOMRMarketsQuery(OMRInterfaceEntities As OMRInterfaceCustomCode.OMRInterfaceEntities) As System.Data.Objects.ObjectQuery(Of OMR.OMRInterfaceCustomCode.OMRMarket)
    Dim OMRMarketsQuery As System.Data.Objects.ObjectQuery(Of OMR.OMRInterfaceCustomCode.OMRMarket) = OMRInterfaceEntities.OMRMarkets
    'To explicitly load data, you may need to add Include methods like below:
    'OMRMarketsQuery = OMRMarketsQuery.Include("OMRMarkets.OMRMarketType").
    'For more information, please see http://go.microsoft.com/fwlink/?LinkId=157380
    'Update the query to include Properties data in OMRMarkets. You can modify this code as needed.
    OMRMarketsQuery = OMRMarketsQuery.Include("Properties")
    'Update the query to include OMRBuildingSurveys data in OMRMarkets. You can modify this code as needed.
    OMRMarketsQuery = OMRMarketsQuery.Include("Properties.OMRBuildingSurveys").Where("it.ID = 12")
    'Returns an ObjectQuery.
    Return OMRMarketsQuery
End Function

Private Sub Window_Loaded_1(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
    Dim OMRInterfaceEntities As OMR.OMRInterfaceCustomCode.OMRInterfaceEntities = New OMR.OMRInterfaceCustomCode.OMRInterfaceEntities()
    'Load data into OMRMarkets. You can modify this code as needed.
    Dim OMRMarketsViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("OMRMarketsViewSource"), System.Windows.Data.CollectionViewSource)
    Dim OMRMarketsQuery As System.Data.Objects.ObjectQuery(Of OMR.OMRInterfaceCustomCode.OMRMarket) = Me.GetOMRMarketsQuery(OMRInterfaceEntities)
    OMRMarketsViewSource.Source = OMRMarketsQuery.Execute(System.Data.Objects.MergeOption.AppendOnly)

    Dim QGradeList = From q In OMRInterfaceEntities.OfficeQualityGrades
    Dim QGsource = CType(Me.FindResource("QGradeLookup"), CollectionViewSource)
    QGsource.Source = QGradeList.ToList()

End Sub
4

2 に答える 2

0

わかりました、助けてくれてどうもありがとうございました。あなたのソリューションはさまざまなシナリオで完全に機能しますが、各建物の調査には独自の品質グレードがあります。答えは、オブジェクトを間違って参照していたということです。オブジェクト OfficeQualityGrade の名前ではなく、列の名前 (OfficeQualityGradeID) を使用していました。

次のコードは、品質グレードを表示するためのテキスト ブロックと、品質グレードを編集するためのコンボ ボックスを提供します。

                    <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock
                            Text="{Binding OfficeQualityGrade.QGrade}"
                            />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>

                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox
                            x:Name="QGradeSelector"
                            IsEditable="False"
                            ItemsSource="{Binding Source={StaticResource QGradeLookup}}"
                            DisplayMemberPath="QGrade"
                            SelectedValuePath="ID"
                            SelectedValue="{Binding Path=OfficeQualityGradeID}"
                            IsSynchronizedWithCurrentItem="False"
                            >
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
于 2013-09-03T02:11:50.573 に答える