1

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

Table User
  ID
  Name

Table Comments
  ID
  UserID
  Title
  Text

我想在 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(我猜这是默认比较,即引用比较),所以在对象中你有一个对象的引用,在列表中你有一个引用另一个(两者都使用相同的 EntityKey)。

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

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

于 2010-05-14T15:46:34.793 回答