我最近发现了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的链接已经腐烂了。我读到的另一个相关问题提到,最初不可见的控件在创建时没有句柄,并将其作为一个可能的因素进行讨论
*不确定控件的生命何时开始,请参阅“创建绑定后设置可见性”注释