彼此继承的ViewModel列表

时间:2018-01-10 11:08:00

标签: c# wpf inheritance mvvm viewmodel

原谅标题 - 我真的不能用更简洁的方式来表达它。

好的,首先我在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;。

老实说,在那个阶段,我以为我会来这里问。可能整个组织都是错的,所以担心这个结尾部分是没有意义的,因为它永远不会奏效。我可能完全在一些错误的假设和误解下工作,有经验和知识的人可以帮助我。

视图模型列表是否需要是非抽象类型?视图模型接受的泛型类型是否相互继承会导致太多问题?我的意思是视图模型相互继承,但泛型类型也是如此。老实说,当涉及到将它们全部放在一个列表中时,它真的有点令人头疼。可以吗?是否有更好/更简单/更容易理解的方式?

好的,谢谢你的阅读。我希望我能得到一些有用的提示。

0 个答案:

没有答案