ToolStripLabel 未使用 PropertyBinding 更新应用程序设置

ToolStripLabel not updated with application settings using PropertyBinding

我可能有一个非常简单的问题,但找不到解决方案。 属性 绑定到 ToolStripLabel 时遇到问题。 Label 绑定到 App.Config.

中的 COM 端口值

如果我将 属性 绑定到 System.Windows.Forms.Label 标签,则通过更改 COM 端口更新 Text-属性 可以正常工作。但是当标签为 IN ToolStrip (System.Windows.Forms.ToolStripLabel) 时,标签不会通过在运行时更改 COM 端口的值来更新。
它只会在重新启动应用程序时更改。

图中有PropertyBindingApplicationSettings的当前设置。

我已经试过了:

没什么区别。 有人知道问题出在哪里吗?

您好, 萨沙

ApplicationSettings

Label Properties Settings

Example

ToolStripLabel 组件不像标签控件那样实现数据绑定(这就是为什么您可以看到标签控件在当前设置更改时更新其文本的原因)。当您通过设计器将 PropertyBindings 添加到 Text 属性 时,文本仅设置为所选的 Properties.Default 设置(您可以在 Designer.cs 中看到文件)。

您可以构建自己的 ToolStripLabel,实现 IBindableComponent, decorate it with ToolStripItemDesignerAvailability 标志,允许 ToolStrip 或 StatusStrip 确认此自定义组件的存在,因此您可以直接从选择工具添加它。

PropertyBinding 添加到文本 属性,现在,当设置更改时,文本也会更新。您可以在Designer.cs文件中看到添加了DataBinding。

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;

[ToolStripItemDesignerAvailability(
    ToolStripItemDesignerAvailability.ToolStrip | 
    ToolStripItemDesignerAvailability.StatusStrip),
 ToolboxItem(false)
]
public class ToolStripDataLabel : ToolStripLabel, IBindableComponent
{
    private BindingContext m_Context;
    private ControlBindingsCollection m_Bindings;

    public ToolStripDataLabel() { }
    public ToolStripDataLabel(string text) : base(text) { }
    public ToolStripDataLabel(Image image) : base(image) { }
    public ToolStripDataLabel(string text, Image image) : base(text, image) { }

    // Add other constructors, if needed

    [Browsable(false)]
    public BindingContext BindingContext {
        get {
            if (m_Context == null) m_Context = new BindingContext();
            return m_Context;
        }
        set => m_Context = value;
    }

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ControlBindingsCollection DataBindings {
        get {
            if (m_Bindings == null) m_Bindings = new ControlBindingsCollection(this);
            return m_Bindings;
        }
    }
}