【问题标题】:How to bind to a child property and still get updates?如何绑定到子属性并仍然获得更新?
【发布时间】:2012-03-08 00:49:09
【问题描述】:

我有以下表格

CREATE TABLE parent
( 
   id           NUMBER(10, 0) NOT NULL, 
   name         VARCHAR2(15 CHAR) NOT NULL, 
   child_id     NUMBER(10, 0) NOT NULL, 
   primary key (id) 
); 

CREATE TABLE child
( 
   id           NUMBER(10, 0) NOT NULL, 
   name         VARCHAR2(15 CHAR) NOT NULL, 
   primary key (id) 
); 

ALTER TABLE parent 
ADD constraint foreign key (child_id) references child; 

还有下面的 XAML

<DataGrid Name="aDataGrid">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=NAME}" />
        <DataGridTextColumn Binding="{Binding Path=CHILD.NAME}" />
     </DataGrid.Columns>
</DataGrid>

数据是这样绑定的:

using(var context = new Entities())
{
    this.aDataGrid.ItemsSource = context.Parent.ToList();
}

当我:

var parent = this.aDataGrid.SelectedItem as Parent;
parent.Name = anotherName;

DataGrid 中的第一个单元格立即更新。但是当我:

var parent = this.aDataGrid.SelectedItem as Parent;
parent.Child = anotherChild;

它不会自动更新第二个单元格。

如何纠正这个问题?我错过了什么?

【问题讨论】:

  • 显示您创建和绑定集合的位置。显示 Parent 和 Child 的类。
  • @BalamBalam 我包含了请求的代码
  • 不,您没有包含请求的代码。显示 Parent 和 Child 的类。
  • @BalamBalam 它们是Entity Framework基于上述Oracle Tables生成的。
  • 哦,您应该在问题中包含该详细信息,并且应该使用 EntityFramework 对其进行标记。仍然需要看到那些课程。他们是否实现了 iNotifyPropertychanged。

标签: c# .net wpf binding entity-framework-4


【解决方案1】:

您是否需要在 Child 属性的设置器中隐含 INotifyPropertyChanged 和 RaisePropertyChanged "Child"?这应该标记它需要更新的绑定 - 没有这个绑定不知道属性已更改。
如果您的父/子对象是 EF 生成的,那么您可能需要在 Google 上搜索“EF 和 MVVM”,了解如何将这些对象粘合到您的 UI 视图中 - 包括但不限于触发属性更改更新。

【讨论】:

  • 不,整个解决方案中没有INotifyPropertyChanged,代码是EF4生成的,我可以修改吗?
  • 我不熟悉 EF 生成的代码,但我猜它会生成一个花园所有 .NET 属性,而不是针对 WPF 绑定量身定制的东西。您可能可以使用部分类将其添加到生成代码的顶部,但通常您会将 ViewModel 包装器添加到您的 EF 对象,作为 EF 对象(模型)和 UI xaml(视图)ala MVVM 之间的粘合剂。通常它是隐含 INotifyPropertyChange 的视图模型。
【解决方案2】:

我可以强制 DataGrid 使用

加载新值
var itemsSource = this.aDataGrid.ItemsSource as IEnumerable<Parent>;
this.aDataGrid.ItemsSource = itemsSource.ToList();

但这似乎不对。 我刚刚发现也可以使用

this.aDataGrid.Items.Refresh();

但我仍然认为那一定是更好的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2022-01-22
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多