这是一个测试项目来展示我的问题。(VS2012、WinForms、EntityFramework 5、XtraGrid 12.5)
由 EF PowerTools - 逆向工程师 CodeFirst 工具创建的模型。
在 timer1_tick 事件中,我正在更改 mypoco.value 属性。我期待 grid.cell 会自动显示此更改,但不会。我也尝试过使用文本框,但还是一样。
如果我BindingSource.ResetCurrentItem()
在 timer1_tick 中取消注释可以正常工作,但这不是我的问题。如果我强制网格(或文本框)刷新一切都很好。
我希望 ef 创建的代理对象通过接口、方法或继承通知 DbSet.Local (ObservableCollection) -> BindingList -> BindingSource -> Grid 等,或者我不知道......我在问这个通知系统,为什么不在职的?或者它正在工作,但我的期望是错误的?(
为什么这没有按预期工作,我在哪里失败了?另请阅读代码中的注释。
谢谢你。
//FORM CODE
public partial class Form1 : Form
{
testContext context = new testContext();
MyPOCO mypoco;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
mypoco = context.MyPOCOes.Create();
// mypoco is created but not proxied currently. state = detached
// After adding it context proxy created and change tacking will be available
context.MyPOCOes.Add(mypoco);
// mypoco is in the memory but not saved to database. This is why using Local
myPOCOBindingSource.DataSource = context.MyPOCOes.Local.ToBindingList();
// Setup timer
timer1.Interval = 15 * 1000;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
// Change the property and then warn user about this event occured
// At this point mypoco is proxied
mypoco.Value = 99;
this.Text = "Timer Tick";
//myPOCOBindingSource.ResetCurrentItem();
}
}
// some code from Form1.Designer file
private System.Windows.Forms.BindingSource myPOCOBindingSource;
private void InitializeComponent()
{
this.myPOCOBindingSource = new System.Windows.Forms.BindingSource();
....
this.myPOCOGridControl.DataSource = this.myPOCOBindingSource;
}
//MYPOCO
public partial class MyPOCO
{
public int ID { get; set; }
public Nullable<int> Value { get; set; }
}
//MAPPING
public class MyPOCOMap : EntityTypeConfiguration<MyPOCO>
{
public MyPOCOMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Table & Column Mappings
this.ToTable("MyPOCO");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.Value).HasColumnName("Value");
}
}
//CONTEXT
public partial class testContext : DbContext
{
static testContext()
{
Database.SetInitializer<testContext>(null);
}
public testContext()
: base("Name=testContext")
{
}
public DbSet<MyPOCO> MyPOCOes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new MyPOCOMap());
}
}