WPF<->;实体绑定
本文关键字:实体 绑定 gt lt- WPF | 更新日期: 2023-09-27 18:25:38
我在将数据从数据源(通过实体fw的数据库)更新到wpf-windows时遇到问题。我使用实体框架生成文件,所以我以这种方式访问数据库中的数据:
public partial class sampleWindow : Window
{
myEntity en = new myEntity();
public sampleWindow()
{
InitializeComponent();
Bind();
}
private void Bind()
{
var list = from o in en.table select o;
someDatagrid.ItemsSource = list.ToList();
}
首先,这个方法对我的程序来说是足够的,我在数据库上做了一些操作后刷新了"绑定"方法,所以我的数据网格或组合中的数据是新鲜的。当我在不同的wpf窗口中更改数据库时,出现了这个问题。我已经读到,我应该实现可观察的接口,并使用load而不是itemsSource。我试着去做,但我很笨,我的尝试失败得很惨。有人能一步一步地告诉我,我该怎么做吗?
您需要一个Singleton来管理您的数据,并结合使用ObservableCollection来公开数据。当集合被任何视图更改时,它将通知观察的任何订阅者,他们将自动更新。
请参阅:XAML应用程序中的可绑定列表示例(第一部分)Singleton 的示例
您可能希望使用一个singleton作为实体的实例,如Sharp Ninja所述。他的文章在他发布的链接中做了很好的解释。您将希望使用可观察集合将ItemSource绑定到。当从可观察集合添加或删除项目时,UI会自动得到通知。您将面临的问题是没有.ToObservableCollection()扩展方法内置在.net中,因此您必须实现自己的方法。
我使用这种扩展方法
public static ObservableCollection<T> ToObservableCollection<T>(
this IEnumerable<T> enumeration)
{
return new ObservableCollection<T>(enumeration);
}
因此,现在您的绑定方法可以将ItemSource设置为可观察集合
private void Bind()
{
var list = from o in en.table select o;
someDatagrid.ItemsSource = list.ToObservableCollection();
}
有很多比您的方法更好的方法(MVVM模式)来实现这一点。为了保持简单,可以通过以下方式完成:
//Gets the Load() extention method available for DbSet
using System.Data.Entity;
private void Bind()
{
myEntity.table.Load();
/*Local returns an obvervable collection convenient for data binding.
This is a synchronized local view of your data. It means any item added , deleted and updated will be reflected in your controls.*/
var obsColl = myEntity.table.Local;
someDatagrid.ItemsSource = obsColl;
}