Not*_*sxl 1 c# data-binding events mvvm winforms
只有在完成所有初始数据绑定后,我才需要更改某个 DataGridView 的属性(其绑定之一的 DataSourceUpdateMode)。
我尝试订阅“DataBindingComplete”事件,但它触发了太多次(对于与控件关联的每个绑定一次或多次);我需要的是一个更全局的“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);
}
Run Code Online (Sandbox Code Playgroud)
它有效,但它闻起来像一个丑陋的黑客很多(而且它被调用了太多次,只有一次就足以满足我的需要)。
有没有更好的办法?
(是的,我正在尝试在 Windows 窗体项目中采用 MVVM,并且我已经向 DataGridView 添加了一个可绑定的“SelectedItems”属性...)
我在Windows Forms 表单级别所做的,并且可能会即兴创作到您想要的控件,是将 Windows Forms 基类子类化为我自己的。然后,在其构造函数中,将额外的事件调用附加到该Load()事件。
因此,当其他所有内容都完全加载时,只有 THEN 才会命中我的自定义方法(子类的)。由于它是附加到事件队列的调用堆栈链的底部,我知道它是最后一个,其他一切都完成了......这是概念的一个片段。
public class MyForm : Form
{
public MyForm()
{
this.Load += AfterEverythingElseLoaded;
}
private void AfterEverythingElseLoaded(object sender, EventArgs e)
{
// Do my own things here...
}
}
Run Code Online (Sandbox Code Playgroud)
Init()如果这更适合您的控件,这个概念也可以应用于函数......让其中的其他所有内容都初始化(),然后执行“AfterInitialized()”函数。
| 归档时间: |
|
| 查看次数: |
4216 次 |
| 最近记录: |