【发布时间】:2014-08-15 14:38:18
【问题描述】:
我觉得这应该很容易,但今天早上我的大脑出现了问题。
我有一个自定义 UserControl 绑定到自定义 ItemsSource。我想将其设置为使用匹配的Control 根据用户定义的绘制项目的方式绘制每个项目。
例如,我希望能够从使用控件的类中执行此操作
var data = new List<object>();
data.Add(new MyClassA());
data.Add(new MyClassB());
data.Add(new MyClassB());
myCustomControl.ItemsSource = myObjectArray;
myCustomControl.ResourceLibrary = {
{ MyClassA, ctlClassA },
{ MyClassB, ctlClassB }
}
在我的自定义控件中,类似的东西
foreach(var item in ItemsSource)
{
var key = item.GetType();
if (ResourceLibrary.ContainsKey(key))
{
var ctlType = ResourceLibrary[key];
if (ctlType != null)
{
var ctl = new ctlType();
// Do something with control
}
}
}
我可以为ResourceLibrary 使用哪种数据类型来允许我这样做?或者有没有更好的方法来完成这项任务?
我还希望能够将传入的类型限制为仅允许类型where T : Control, new()
我正在使用 WinForms、C# 和 .Net 3.5
【问题讨论】:
-
你的一个问题是
var ctl = new ctlType();,C# 不做虚拟构造函数。 -
使用 MVVM 和 Caliburn,将其替换/包装为
MyClassAViewModel和MyClassAView,整个事情就变得自动化了。 -
@HenkHolterman 我希望我可以为此使用 WPF,但它是 WinForms 和 .Net 3.5
-
嘿..你在winforms中实现
ItemsControl?这很酷.. 代码是专有的吗?否则,如果你能分享它,那就太棒了。 -
@HighCore 我没有尝试任何非常高级的东西......我只想要一个可绑定的 TabControl。似乎向 WinForms 索取有点过分了... =/