c# - Windows 窗体绑定(bind) : is there an event similar to DataBindingComplete, 但在所有绑定(bind)完成时触发?

标签 c# winforms events data-binding mvvm

只有当它的所有初始数据绑定(bind)都完成时,我才需要更改某个 DataGridView 的属性(其绑定(bind)之一的 DataSourceUpdateMode)。

我尝试订阅“DataBindingComplete”事件,但它被触发了太多次(与控件关联的每个绑定(bind)一次或多次);我需要的是更全局的“AllDataBindingsComplete”事件,当控件准备好显示给用户时触发。

作为临时解决方法,我正在使用 MouseDown 事件(我假设当用户能够单击该控件时,这意味着该控件已显示...:) 以及我正在播放的事件与 - SelectionChanged - 在 MouseDown 之后触发):

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

        base.OnMouseDown(e);
    }

它有效,但它闻起来像一个丑陋的 hack 很多(而且它被调用了太多次,只有一次就足以满足我的需要)。

有没有更好的办法?

(是的,我正在尝试在 Windows 窗体项目中采用 MVVM,并且我已将可绑定(bind)的“SelectedItems”属性添加到 DataGridView 中...)

最佳答案

我在 Windows Forms 上做了什么form 级别,并且可以即兴创作到您想要的控件,是将 Windows Forms 基类子类化为我自己的。然后,在其构造函数中,将额外的事件调用附加到 Load() 事件。

因此,当所有else完全加载 时,只有 THEN 它才会触发我的自定义方法(子类的)。因为它是附加到事件队列的调用堆栈链的底部,所以我知道它是最后一个,其他一切都已完成...这是概念的一个片段。

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

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

这个概念也可以应用于 Init() 函数,如果它更适合您的控制...让其中的所有其他内容都被初始化 (),然后您是否执行“AfterInitialized()” "函数。

关于c# - Windows 窗体绑定(bind) : is there an event similar to DataBindingComplete, 但在所有绑定(bind)完成时触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6228655/

相关文章:

c# - WinForms C# - 自由绘制的正确方法?

c# - 向 TreeView 添加图形

events - 如何在 Glassfish 3.1 中结合 @Asynchronous 和 Weld/CDI 事件和 @Observes(during=TransactionPhase.AFTER_COMPLETION)

c# - 在数据库或数据表中查询一列中的重复记录

c# - 缩放绘图视觉算法

c# - 从 Form1 打开 Form2,从 Form2 关闭 Form1

java - 获取组件上注册的所有监听器

javascript - 如何将点击事件附加到以编程方式创建的 jquery 对象?

c# - SQL Server 批量复制插入百万条记录很慢

c# - LINQ to Entities - 查询中的 Where IN 子句