【问题标题】:Adding a record to EF 4.1 does not reflect in listbox向 EF 4.1 添加记录不会反映在列表框中
【发布时间】:2013-04-04 16:05:12
【问题描述】:

我有一个首先使用 EF 4.1 模型构建的数据绑定列表框。所以我所有的课程都是为我建造的。因为我有三个控件来反映从外键回溯的表数据。 this.lstBox2.ItemSource = entityContext.TableObject2.ToList() 将返回每条记录。不是 M-D 显示的受外键约束限制的记录。

TableObject2 class2 = new TableObject2();
class2.value1 = 0;
class2.value2 = "new location";

using (TKOEntities entityContext = new TKOEntities())
{
                entityContext.TableObject2.AddObject(class2);
                entityContext.SaveChanges();
                this.lstBox2.ItemsSource = null;
}

SaveChanges 确实将数据更新到数据库中。但是控件没有刷新(this.lstBox2.Refresh() 不起作用)。如果我尝试将值设置为控件。我也得到了我们的 ItemControl.ItemSource 错误。如何为控件分配保存到实体上下文的更新值?

【问题讨论】:

    标签: c# wpf entity-framework


    【解决方案1】:

    模型更改不会自动传播到视图模型或您的视图(我可以看到您没有 MVVM 视图模型?)

    您通常需要BindPropertyChanged

    这是从设备上写的,非常粗糙和快速(我可能打错了什么等等)......

    <ListBox ItemsSource={Binding YourCollectionProperty} >
    

    在您的“视图模型”中(或者如果这是您的“控件”,我不建议这样做,则执行{Binding ElementName=_mywin, Path=YourCollectionProperty} 之类的操作)将属性定义为...

    public ObservableCollection<POCOItem> YourCollectionProperty 
    {
    get
    {
         return _collection ?? (_collection = WrapModel());
    }
    set
    {}}  
    

    实现IPropertyChanged interface 当你的模型更新时......

    _collection = null;
    OnPropertyChanged("YourCollectionProperty");
    

    ObservableCollection 在这里毫无用处(数组/列表也一样——保持模型集合同步并不容易。

    因此,如果您需要与您的模型密切相关 - 您可以将模型导航属性 ICollection 设置为 ObservableCollection(尽管有利有弊,但不要深入探讨)。

    例如看到这个Do I need to implement INotifyPropertyChanged when using EF Code-First?

    在这种情况下 - 当只是添加新项目时 - 应该会自动转到您的 ListBox。

    如果您刷新集合 - 然后执行上述操作(为集合属性设置 PropertyChanged)

    Item Properties are not automatically updated - 除非您也在模型上实现 IPropertyChanged。

    【讨论】:

      【解决方案2】:

      代替:

      this.lstBox2.ItemsSource = null;
      

      保存更改后尝试从 entityContext 获取数据以重建列表:

      this.lstBox2.ItemsSource = entityContext.TableObject2.ToList();
      

      我敢肯定,您可以采用更好的方法,但是要快速将数据从数据库中取出并放入列表中,这应该可行。

      也是一个快速的代码位,你可以使用对象初始化器:

      TableObject2 class2 = new TableObject2 { value1 = 0, value2 = "new location" };
      

      【讨论】:

      • this.lstBox2.ItemsSource = entityContext.TableObject2.ToList();将返回所有内容并重新加载控件中的数据,但它是所有内容,不限于 Master-Detail 在第一个控件上选择的内容。
      • 那么你需要在执行 ToList() 之前应用一个选择过滤器,并传入第一个控件的选定值。
      • 或者,使用Include方法,传入TableObject2作为其选择器,通过fk获取相关的TableObject2对象。 var obj = entityContext.MDTable.Include("TableObject2").FirstOrDefault(x => x.Id = slected.Id); this.lstBox2.ItemsSource = obj.TableObject2s.ToList();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2012-07-05
      相关资源
      最近更新 更多