【问题标题】:Binding DataGridComboBoxColumn to a one to many entity framework relation将 DataGridComboBoxColumn 绑定到一对多实体框架关系
【发布时间】:2011-02-17 13:30:36
【问题描述】:

我在模型中有两张表,一张表包含与另一张表以一对多关系相关的条目,例如:

Table User
  ID
  Name

Table Comments
  ID
  UserID
  Title
  Text

我想在 WPF 窗口中显示一个数据网格,其中包含两列,一列带有用户名的文本列,另一列带有显示用户创建的所有 cmets 的组合框。

datagrid的定义是这样的:

        <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 的属性,该属性指向用户创建的所有 cmets。查询正在返回数据并显示用户名,但未填充组合框。

可能是方法完全错误,或者我只是在这里遗漏了一个非常简单的点,我愿意学习更好的方法来做到这一点。

谢谢

【问题讨论】:

    标签: c# wpf entity-framework binding wpfdatagrid


    【解决方案1】:

    其实我已经用过你的方法了。它可以工作,但需要注意的是:组合框只能显示给定对象的当前项,如果它在其允许值列表中(此处为entities.Users)。

    您会说“是的,但确实如此!我已将整个 Users 列表放入其中”。可悲的是,事实并非如此。 EF 中实体的默认比较不是基于 EntityKeys(我猜这是默认比较,即引用比较),所以在对象中你有一个对象的引用,在列表中你有一个引用另一个(两者使用相同的 EntityKey)。

    我的解决方案是覆盖User 类的比较函数,只需检查 ID==ID。请注意,我并不是说这是最好的方法(例如,它可能会在您的其余代码中产生不良后果),只是它对我来说效果很好。

    哦,一般建议不要将控件直接绑定到 IQueriables,而是绑定到 Execute 函数的结果(否则查询将对数据库运行两次),有关详细信息,请参阅 msdn

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 2015-03-24
      • 2013-11-24
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多