MVVM基础视图模型类

时间:2011-07-05 13:53:46

标签: c# mvvm

我正在创建一个基本视图模型类。 ViewModelBase是一个抽象类,我想定义我希望所有其他派生视图模型实现的属性。

其中一个属性是ObservableCollection:

public abstract ObservableCollection<???> Items { get; set; }

从此基类派生的类将定义不同类型的项目(ObservableCollection<Person>ObservableCollection<Car>)。

如果我在ViewModelBase中将ObservableCollection类型设置为object,则需要在派生类中进行大量不同的转换才能使其工作。

这是正确的方法吗?

5 个答案:

答案 0 :(得分:11)

我不太确定你为什么要这么通用,但如果你这样做,我建议你也把抽象基类做成通用的:

public abstract class ViewModelBase<T>
{
    public abstract ObservableCollection<T> Items { get; set; }
}

我希望你也确保你的ViewModelBase实现了INotifyPropertyChanged。

答案 1 :(得分:2)

public abstract ObservableCollection<TYPE> Items { get; set; }

您可以通过多种方式定义TYPE,包括使用/继承基类或接口时。

答案 2 :(得分:2)

如果要为应用程序中的 all 视图模型创建基本视图模型,那么每个单个视图模型都不可能拥有可观察的集合。< / p>

您可以考虑使用合成而不是继承(或更可能的,以及继承)来为视图模型添加常用功能。

例如:

// Base for ALL view models implements necessary interfaces.
public abstract class BaseViewModel : INotifyPropertyChanged, IDisposable
{
  // Functionality useful to ALL view models
  public string DisplayName { get; }
  // etc.
  ...
}

// Generic collection view model implementing functionality required by
// all collection view models.
public abstract class CollectionViewModel<T> : BaseViewModel
{
    public abstract ObservableCollection<T> Items { get; set; }
}

// Specific collection view model using generic one through composition
public class PersonCollectionViewModel : BaseViewModel
{
    public CollectionViewModel<Person> PersonCollection { get; }
    // other functionality not included in all collection view models.
    // ...
}

答案 3 :(得分:0)

定义一些类{Entity},它可以是Car和Person的基类:你会得到你想要的东西+强类型。

答案 4 :(得分:0)

您希望使您的基类通用

然后你可以有这样的定义

public abstract  class ViewModelBase<T>
{
     public abstract ObservableCollection<T> Items { get; set; }
}

如果你想要一个viewmodels列表,那么我建议你创建一个非通用的基类,通用的基类继承并有一个列表

public abstract  class NonGenericBaseViewModel
{
   ObservableCollection<object> ItemsAsObjects{get;set;}
}

public abstract  class ViewModelBase<T> : NonGenericBaseViewModel
{
     public  ObservableCollection<T> Items { get; set; }
}

然后你可以有一个

ObservableCollection<NonGenericBaseViewModel> 

如果你想要