2011-06-03 32 views
1

我只有在完成其所有初始数据绑定时,才需要更改某个DataGridView的属性(用于其某个绑定的DataSourceUpdateMode)。我尝试订阅“DataBindingComplete”事件,但它被触发了太多次(每个绑定关联到控件一次或多次)。我需要的是一个更全局的“AllDataBindingsComplete”事件,当控件准备好显示给用户时触发。Windows窗体绑定:是否有类似于DataBindingComplete的事件,但在所有绑定完成后触发?

作为临时解决方法,我使用MouseDown事件(我假定当用户能够单击控件时,这意味着控件显示... :)以及事件我是的SelectionChanged - - 摆弄的鼠标按下解雇后):

protected override void OnMouseDown(MouseEventArgs e) 
    { 
     Binding selectedItemsBinding = this.DataBindings["SelectedItems"]; 
     if (selectedItemsBinding != null) 
     { 
      selectedItemsBinding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged; 
     } 

     base.OnMouseDown(e); 
    } 

它的工作原理,但它闻起来像一个丑陋的劈了很多(这就是所谓的次数太多,只是一个时间足够满足我的需求)。

有没有更好的方法?

(是的,我想采用MVVM在Windows窗体项目,我添加了一个可绑定“SelectedItems”属性到DataGridView ...)

回答

4

我在Windows Forms已经做了形式级别,并且可以简单地将它们简化为您想要的控件,就是将Windows窗体基类继承到我自己的子类。然后,在其构造函数中,将附加的事件调用附加到Load()事件。

所以,当一切其他完全加载,才将它打(的子类)我的自定义方法。由于它是连接到事件队列的调用堆栈链的底部,所以我知道它是最后一切,其他所有事情都已完成......这是概念的一部分。

public class MyForm : Form 
{ 
    public MyForm() 
    { 
     this.Load += AfterEverythingElseLoaded; 
    } 

    private void AfterEverythingElseLoaded(object sender, EventArgs e) 
    { 
     // Do my own things here... 
    } 
} 

这一概念可以应用于Init()功能太多,如果这是更适合你的控制......让一切在它得到初始化(),那么你的“AfterInitialized()”函数。

+0

我想保持我的控制尽可能多的“容器不可知”,在内部处理所有这些东西。无论如何,我试图从控件构造函数中获取对父窗体的引用,但是this.FindForm()并不总是返回一个非空窗体(即使是在ParentChanged处理程序中调用它)。现在,我使用第一个“Enter”事件,它比“MouseDown”事件更好,因为它甚至可以通过键盘导航来调用) – Notoriousxl 2011-06-03 18:22:21

+0

...最后,我遵循了您的建议(Load事件),将DataGridView封装在用户控件(具有Load事件)中,并将自定义可绑定属性移动到它,而不是子类。 :) – Notoriousxl 2011-06-04 14:46:20

相关问题