gpt4 book ai didi

c# - 如何以正确的方式将网格绑定(bind)到基于 EF 的 View 模型?

转载 作者:行者123 更新时间:2023-12-03 10:35:22 25 4
gpt4 key购买 nike

我继承了一个项目,其中数据模型是使用 EF 6 基于数据库创建的。我正在创建一个 View 模型,如下所示,其中 Data 是为我的数据库上下文自动生成的类型(即它包含与表中的表对应的字段数据库)。

public class ViewModel : INotifyPropertyChanged
{
private Data _data = new Data();

private ObservableCollection<Order> _orders;
public ObservableCollection<Order> Orders
{
get { return _orders; }
set
{
_orders = value;
OnPropertyChanged("Orders");
}
}

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(String propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}

在 XAML 代码中绑定(bind)网格应该不难,只需要我指向属性 Orders。但是,我不知道如何从数据库中填充属性(我没有看到任何 Load 方法),也不知道数据库将如何更新(如果网格值发生更改并且绑定(bind)设置为 TwoWay)。

我用谷歌搜索了它,但没有找到任何合适的东西。建议?

数据在以下类中自动生成。
public partial class Data : DbContext
{
public Data() : base("name=Data") { }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}

public virtual IObservable<Order> Orders { get; set; }
}

问题是,当我创建数据实例时,属性 Orders 似乎为空,我不确定如何填充它。没有用于加载、枚举、选择、定位等的方法......它的类型是 IObservable,而不是 IEumerable,我也看不到任何 ToList 或 ToEnumerable 方法......

编辑

当我尝试将不同的表加载到集合中时,我注意到其中一个是空的,没有明显的原因。

enter image description here

最佳答案

使用 Data类,您可以创建一个默认构造函数来设置 Orders ViewModel 中的属性,如下所示:

public class ViewModel : INotifyPropertyChanged
{
private Data _data = new Data();

private ObservableCollection<Order> _orders;
public ObservableCollection<Order> Orders
{
get { return _orders; }
set
{
_orders = value;
OnPropertyChanged("Orders");
}
}

//define a constructor
public ViewModel()
{
_data.Set<Order>().Load();
this.Orders=_data.Set<Order>().Local;
}
//...
}
LocalDbSet<T> 的属性类,它得到一个 ObservableCollection<T>表示所有 Added 的本地 View , Unchanged , 和 Modified此集合中的实体。在上下文中添加或删除实体时,此本地 View 将保持同步。同样,添加到本地 View 或从本地 View 中删除的实体将自动添加到上下文中或从上下文中删除。

现在,由于 DbSet<TEntity>.Local为您提供当前由 DbContext 跟踪的对象,你需要先加载到内存中——你需要绑定(bind)的实体。这样你就需要调用 Load方法第一,具体化您的查询。

最后,WPF 本身支持绑定(bind)到 ObservableCollection。因此,无需额外的代码即可拥有完全支持 WPF 排序、过滤等的双向数据绑定(bind)。

更新 1

如果您更改 Orders 的类型属性(property)给 DbSet<Order>Data类,那么你可以设置 Orders你的 ViewModel 的属性是这样的:
    _data.Orders.Load();
this.Orders=_data.Orders.Local;

关于c# - 如何以正确的方式将网格绑定(bind)到基于 EF 的 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31838264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com