【问题标题】:Winforms Databinding and multiple FormsWinforms 数据绑定和多个表单
【发布时间】:2015-12-29 16:17:10
【问题描述】:

我有一个包含多个用户控件的主窗口,这些用户控件排列为选项卡页和选项卡组(很像 Visual Studio 允许同时显示两个或多个编辑器)。

我还可以将这样的 UserControl 打开到单独的浮动窗口中。

其中一个用户控件包含简单的表单字段(例如文本框)。这些文本框与对象/属性的通用数据绑定绑定在一起。绑定模式是 OnValidation(不是 OnPropertyChanged)。

当我将焦点从主窗口中的此用户控件切换到主窗口中的另一个用户控件时,将自动执行验证并完成数据绑定/更改的文本将设置在有界的模型对象/属性上到那个文本字段。

但是,如果我将焦点切换到驻留在另一个(浮动)窗口中的 UserControl,则数据绑定未完成,因为未执行任何验证。

我知道我可以通过触发 ValidateChildren 等手动处理此问题,但这在我看来是错误的方式 / 是丑陋的。

是否有解决此问题的“正确”/干净的方法?我希望在 UserControl 失去焦点或窗口被停用时立即执行验证。

一个信息:我的 UserControls 上包含一个 TreeControl。如果我编辑树节点标签,并且当我将焦点切换到另一个(浮动)窗口时,标签编辑会自动完成。我想要有关绑定的常用表单字段的相应行为...

感谢您的帮助!

【问题讨论】:

    标签: winforms validation data-binding focus


    【解决方案1】:

    没有自动的方法来做到这一点。从控件的角度来看,它仍然具有焦点(如果单击标题栏或 Alt-tab 返回主窗口,您会注意到焦点仍然在同一个控件中)。只是控件所在的窗体未激活。如果您希望它在您的表单被停用时保存更改,您必须手动触发它。最好的方法可能是覆盖表单的 OnDeactivate 方法。

        protected override void OnDeactivate(EventArgs e)
        {
            base.OnDeactivate(e);
    
            this.ValidateChildren();
        }
    

    【讨论】:

    • 感谢您的回复。对我来说,问题仍然是:这是树控件、网格控件等识别表单焦点开关的方式吗,它们是否为父表单 Deactivate 事件提供处理程序,并且它们是否跟踪 UserControl 在 ParentChanged 事件上的变化.因为,就像我的用例一样,同一个 UserControl 对象可以在不同的表单之间移动。而对我来说,解决这样一个简单问题所需的整个逻辑似乎很复杂......
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 2017-06-30
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多