我使用的是 VS2017 IDE、DotNet4.5.2 和 WinForm 框架。

我想用进度条显示一个值,所以我编写了以下代码并且它可以工作:

progressBar1.DataBindings.Add(nameof(ProgressBar.Maximum), source, nameof(source.Maximum));
progressBar1.DataBindings.Add(nameof(ProgressBar.Minimum), source, nameof(source.Minimum));
progressBar1.DataBindings.Add(nameof(ProgressBar.Value), source, nameof(source.Status)).Format += (sender,e) => {
    e.Value = (int)(e.Value as IStatus).Value;
};

我想用ToolStripProgressBar来显示它,但是因为它不能进行数据绑定(bind),所以我定义了一个新的类来继承它并实现IBindableComponent如下:
public class BindableToolStripProgressBar : ToolStripProgressBar, IBindableComponent
{
    private BindingContext bindingContext;
    private ControlBindingsCollection dataBindings;

    public BindingContext BindingContext
    {
        get
        {
            if (bindingContext == null)
            {
                bindingContext = new BindingContext();
            }
            return bindingContext;
        }
        set
        {
            bindingContext = value;
        }
    }

    public ControlBindingsCollection DataBindings
    {
        get
        {
            if (dataBindings == null)
            {
                dataBindings = new ControlBindingsCollection(this);
            }
            return dataBindings;
        }
    }
}

然后我将数据绑定(bind)对象从 ProgressBar 更改为新定义的 BindableToolStripProgressBar,但是这次运行应用程序导致抛出 System.FormatException:
tspb.DataBindings.Add(nameof(ProgressBar.Maximum), source, nameof(source.Maximum));
tspb.DataBindings.Add(nameof(ProgressBar.Minimum), source, nameof(source.Minimum));
tspb.DataBindings.Add(nameof(ProgressBar.Value), source, nameof(source.Status)).Format += (sender, e) => {
    e.Value = (int)(e.Value as IStatus).Value; // Will be thrown FormatException
};

我的 IBindableComponent 实现有什么问题吗?
先谢谢了!

最佳答案

ToolStripProgressBar 有一个 ProgessBar 属性,它公开了托管在 ProgressBar 中的 ToolStripControlHost 控件。 MaximumMinimumValueToolStripProgressBar 属性基本上是获取或设置底层 ProgressBar 的对应属性。

所以你可以设置数据绑定(bind)到底层 ProgressBar :

Source source = new Source() { Minimum = 0, Maximum = 100, Value = 50 };
private void Form1_Load(object sender, EventArgs e)
{
    var p = toolStripProgressBar1.ProgressBar;
    p.DataBindings.Add(nameof(p.Maximum), source, nameof(source.Maximum));
    p.DataBindings.Add(nameof(p.Minimum), source, nameof(source.Minimum));
    p.DataBindings.Add(nameof(p.Value), source, nameof(source.Value));
}

关于c# - 数据绑定(bind)无法通过 IBindableComponent 进行转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49852774/

10-13 21:33