代码之家  ›  专栏  ›  技术社区  ›  Caius Jard

属性绑定是否只在可见控件上正常工作?

  •  0
  • Caius Jard  · 技术社区  · 6 年前

    我最近发现了win forms属性绑定的一个奇怪之处,即如果一个控件以不可见的形式开始生命,那么该控件似乎看不到绑定属性的变化。在这种情况下,我是绑定标签的 .Visible 属性到 Properties.Settings.Default.BooleanSetting (默认值为False)。我还绑定了一个复选框 .Checked 对于相同的设置,将复选框切换为选中将导致标签出现,而未选中将导致标签消失。所有的设置都是在窗体设计器中完成的

    只有在应用程序启动时设置为True时,这种方法才能可靠地工作。如果设置为False,则复选框将被取消选中,标签将不可见,但选中复选框不会显示标签。调试后发现设置的值为true,所以复选框更新了它,但是标签 Visible

    如果标签最初是可见的 Enabled 无论设置的初始值如何,都可以绑定并在切换复选框时可靠地翻转状态。问题似乎特别是如果标签一开始是看不见的-一个看不见的标签和它的标签 属性绑定到该布尔值 更改启用状态。

    解决办法似乎是 Properties.Settings.Default.BooleanSetting属性设置 ,在调用前将其设置为true InitializeComponent() 然后还原它。在这种情况下,表单将显示,选中该框将显示不可见的标签

                var b = Properties.Settings.Default.FormatWithoutConfirmation;
                Properties.Settings.Default.FormatWithoutConfirmation = true;
                InitializeComponent();
                Properties.Settings.Default.FormatWithoutConfirmation = b;
    

    我首先得出结论(在相关问题的帮助下) here -询问如何使其工作)控件最初需要可见才能绑定工作,而使控件不可见会使控件陷入永远不可见的困境,以便看到可见中的更改。。

    对于我来说,初始可见理论的一个症结是,根据windows设计器中的代码,绑定发生了 可见性设置为:

            this.label4.AutoSize = true;
            this.label4.DataBindings.Add(new System.Windows.Forms.Binding("Enabled", global::Namespace.Properties.Settings.Default, "BooleanSetting", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
            this.label4.Enabled = global::Namespace.Properties.Settings.Default.BooleanSetting;
            this.label4.Location = new System.Drawing.Point(100, 100);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(35, 13);
            this.label4.TabIndex = 11;
            this.label4.Text = "label4";
            this.label4.Visible = false;
    

    因为这是 可见


    我有种感觉,答案可能就在MSDN的某个地方,作为我链接到的那个问题的答案之一。。。

    假设绑定到控件的Visible属性被破坏,尽管它有时可以工作。看到了吗 http://support.microsoft.com/kb/327305 ,也就是说

    …但是给MSDN的链接已经腐烂了。我读到的另一个相关问题提到,最初不可见的控件在创建时没有句柄,并将其作为一个可能的因素进行讨论


    *不确定控件的生命何时开始,请参阅“创建绑定后设置可见性”注释

    0 回复  |  直到 6 年前
        1
  •  0
  •   Luc Morin    6 年前

    正如所建议的,只要Windows窗体控件没有有效的Windows句柄,数据绑定就不会处于活动状态。

    一旦我明白了问题所在,我就想找到一个解决问题的好方法,但那时,项目负责人没有预算。因此,我沿着懒惰的道路,简单地循环遍历所有选项卡,让它们有机会非常短暂地可见,然后这些选项卡上的所有控件都有可能获得有效的句柄。

    它真的很糟糕,因为标签页可以看到在这个过程中闪烁。这个问题最终没有得到解决,应用程序按原样发布。不用说其他程序员和我自己都不太满意,但是客户从来没有抱怨过。想想看。

    因此,控件必须可见才能获取其句柄,然后才能隐藏。

    推荐文章