我想用不同类型的对象来填充列表框。我在列表框中显示对象的类型(人性化)。
我创建了一个类ListBoxView,它覆盖ToString方法并根据类型返回一个字符串。我创建一个ListBoxView列表并将其数据绑定到列表框。
public class ListBoxView
{
private object m_value;
public ListBoxView(Object value)
{
m_value = value;
}
public override string ToString()
{
if (m_value is Car)
return "Car";
else if (m_value is User)
return "Human";
else
return "Not defined: " + m_value.GetType().ToString();
}
public T Value
{
get { return m_value; }
set { m_value = value; }
}
}
使用泛型可以更好地解决这个问题吗?由于我是仿制药的新手,我在使用它时遇到了困难。
由于
更新 像Human和Car这样的类是我无法改变的数据模型的一部分。我需要在用户界面端解决这个问题
答案 0 :(得分:2)
实际上我认为我只是在ToString()
,Car
等上实施Human
而根本不打扰这个类。否则,每次添加新类型时都必须更新此类。
如果您担心I18n类型名称,请保留此类,但只有这样您才可以将ToString()
的结果通过搜索资源文件中的“本地化”版本的名称
答案 1 :(得分:1)
一个非常简短的解决方案,但可能不是最好的,是将逻辑从ToString方法移动到listBox1_Format事件处理程序。
private string FormatForListbox(object m_value)
{
if (m_value is Car)
return "Car";
else if (m_value is User)
return "Human";
else
return "Not defined: " + m_value.GetType().ToString();
}
private void listBox1_Format(object sender, ListControlConvertEventArgs e)
{
e.Value = FormatForListbox(e.ListItem);
}
答案 2 :(得分:0)
您的解决方案规模很小。特别是,如果您想在ToString
处理除Car
和User
之外的其他类型的特殊情况,请查看会发生什么。
你应该遵循Neil的建议将这种逻辑放在别处,即在特定的类中 - 作为ToString
方法或完全不同的方法(参见代码)。总之,在这里使用泛型无济于事。
interface IInfoProvider {
String Info { get; }
}
class User : IInfoProvider {
…
public override String Info { get { return "Human"; } }
}
class ListBoxView {
…
public override string ToString()
{
IInfoProvider infovalue = m_value as IInfoProvider;
if (infovalue != null)
return infovalue.Info;
else
return "Not defined: " + m_value.GetType().ToString();
}
}