繁体   English   中英

将DataGridComboBoxColumn绑定到一对多实体框架关系

[英]Binding DataGridComboBoxColumn to a one to many entity framework relation

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

Table User
  ID
  Name

Table Comments
  ID
  UserID
  Title
  Text

我想在WPF窗口中显示一个带有两列的数据网格,一个带有用户名的文本列,另一个带有组合框的列,其中显示了用户所做的所有注释。

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;

实体用户具有一个名为“注释”的属性,该属性可导致用户进行所有注释。 查询返回数据,并显示用户名,但组合框未填充。

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

谢谢

我实际上已经使用了您的方法。 它起作用了,但有一个警告:组合框只能显示给定对象的当前项(如果它在其允许值列表中)(在这里是entities.Users )。

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

我的解决方案是通过简单检查ID == ID来覆盖User类的比较功能。 请注意,我并不是说这是最好的方法(例如,它可能会对您的其余代码产生不良影响),只是对我而言效果很好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM