1

我正在创建一个 WPF 数据访问层,在这个阶段可能不需要完整的 MVVM(但我可能会实现它)。

我已经成功创建了一个 ComboBox,它使用 CollectionViewSource 作为数据源将数据绑定到相关表的外键值(请参阅下面的 XAML,组合框可以正常工作,但 TextBlock 不能)。

我只想将 ComboBox 显示为单元格编辑模板,并在未编辑数据时使用 TextBlock 来显示数据。我可以让 TextBlock 几乎可以工作(它显示外键中相关表中的数据),但我找不到“SelectedValuePath”的等效属性,因此 TextBlock 始终显示相关表中的第一个值,而不是与外键字段中的 ID 对应的值。

有没有办法(必须有)从 TextBlock 获得与我在 ComboBox 中的等效行为?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 的模板

这是代码隐藏

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

好的,非常感谢 Nit 的帮助。您的解决方案绝对适用于不同的场景,但每个建筑测量都有自己独特的质量等级。答案是我错误地引用了该对象。我使用的是列的名称 (OfficeQualityGradeID) 而不是对象 OfficeQualityGrade 的名称。

以下代码提供了一个用于显示质量等级的文本块和一个用于编辑质量等级的组合框:

                    <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 回答
0

您在这里提出的要求可以通过以下方式处理。首先将此处的 TextBlock 绑定到 Collection 源并提供 Path 不会给您任何东西。

DataGrid 中的每一行都代表类型的对象,该对象具有我假设为 string 或 int 类型的OMRBuildingSurvey属性。OfficeQualityGradeID现在您想要的是,每当OfficeQualityGrade更改 ID 时,不可编辑的模板(即 TextBlock)应显示所选 OfficeQualityGrade 的等级名称。

这里的问题是您没有在此处捕获选定的 OfficeGrade。因此,您需要做的是首先将 绑定SelectedItemCombobox“OfficeQualityGrade”类型的属性(比如说 SelectedOfficeGrade)。该属性应引发属性更改通知。然后您可以将您的文本块绑定到此属性,如 Text = {Binding SelectedOfficeGrade.Grade}。您必须在您的实体中定义此属性并实施 INotifyPropertychanged。

希望这会有所帮助。

谢谢

于 2013-09-02T05:21:19.613 回答