我使用的是 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
控件。 Maximum
的 Minimum
、 Value
和 ToolStripProgressBar
属性基本上是获取或设置底层 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/