原谅标题 - 我真的不能用更简洁的方式来表达它。
好的,首先我在Visual Studio 2010中使用C#和MVVM创建WPF应用程序。
它是一个语言程序,我的数据模型中有一些继承。 LanguageItem 位于顶部。在降级是 GeneralVocabItem ,然后两个类派生自:动词和 IAdjective 。我在XML中保留了这些列表,然后将它们全部加载到LanguageItem列表中。
现在到视图模型部分。当视图模型表示具有继承的类时,我已经查找了如何处理视图模型。我一直觉得它看起来很棘手,但到目前为止我已经设法避免它。我读here, on Stackoverflow的建议是使用泛型和抽象基类。所以这就是我试图做的事情。
所以基本ViewModel如下:
public abstract class LanguageItemViewModelBase<TModel> : ObservableObject
{
private readonly TModel _dataObject;
protected TModel DataObject { get { return _dataObject; } }
public LanguageItemViewModelBase(TModel dataObject)
{
_dataObject = dataObject;
}
}
然后我查看了我想要的类的模型。 LanguageItem的视图模型如下所示:
class LanguageItemViewModel : LanguageItemViewModelBase<LanguageItem>
{
public LanguageItemViewModel(LanguageItem item) : base(item)
{
}
public int ItemID
{
...
}
public int ItemType
{
...
}
}
并且Verb的视图模型如下所示:
class VerbViewModel : LanguageItemViewModelBase<Verb>
{
public VerbViewModel(Verb item) : base(item)
{
}
public int ItemID
{
...
}
public int ItemType
{
...
}
}
现在,我想要的是一个列表,可以在其中包含任何这些视图模型。
我声明的名单如下:
private ObservableCollection<LanguageItemViewModelBase<LanguageItem>> _languageItemVMs = new ...
现在这可能是我的错误所在。我可以列出这样的抽象类吗?我是通过分配类型来限制自己,还是可以,因为所有类型(对于泛型类型)都来自LanguageItem?所以这部分我不知道。老实说,领土已经变得有点模糊了。
无论如何,当我从XML加载一个LanguageItem时,我的视图模型列表中有一个事件处理程序。它看起来像这样:
Database.Instance.RegisterForLanguageItemAdded(
(Object o) =>
{
// o is some kind of LanguageItem
if (o != null)
{
LanguageItem l = (o as LanguageItem);
LanguageItemViewModel lvm = new LanguageItemViewModel(l);
LanguageItemVMs.Add(lvm);
}
});
现在,这可以正常运行好吧。我创建了一个ListBox来测试这个列表并显示所有项目,显示属性。但是,在该阶段,视图模型具有所有相同的公开值(ItemID和ItemType)。作为测试,我更改了VerbViewModel,因此它暴露了一个未在LanguageItemViewModel中公开的其他属性。它没有出现。也许,我想,这是因为我在上面的事件处理程序中专门将一个LanguageItemViewModel添加到我的视图模型列表中。所以为了测试这个,我还在事件处理程序的列表中添加了一个随机的VerbViewModel。
如下所示:
Verb v = new Verb();
v.ItemID = 100;
v.ItemType = Static_Enums.StaticLanguageItemTypesEnums.TYPE_VERB;
VerbViewModel vvm = new VerbViewModel(v);
LanguageItemVMs.Add(vvm);
我想如果我指定了类型,它可能会有效。
不幸的是,我收到编译错误,告诉我&#39;参数1无法从VerbViewModel转换为LanguageItemViewModelBase&lt; LanguageItem&gt;&#39;。
老实说,在那个阶段,我以为我会来这里问。可能整个组织都是错的,所以担心这个结尾部分是没有意义的,因为它永远不会奏效。我可能完全在一些错误的假设和误解下工作,有经验和知识的人可以帮助我。
视图模型列表是否需要是非抽象类型?视图模型接受的泛型类型是否相互继承会导致太多问题?我的意思是视图模型相互继承,但泛型类型也是如此。老实说,当涉及到将它们全部放在一个列表中时,它真的有点令人头疼。可以吗?是否有更好/更简单/更容易理解的方式?
好的,谢谢你的阅读。我希望我能得到一些有用的提示。