MVVM基视图模型类

本文关键字:模型 视图 MVVM | 更新日期: 2023-09-27 18:01:18

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

属性之一是ObservableCollection:

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

派生自这个基类的类将有不同类型的Items定义(ObservableCollection<Person>, ObservableCollection<Car>)。

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

这是正确的方法吗?

MVVM基视图模型类

我不太确定您为什么要使它如此泛型,但如果您这样做,我建议您使抽象基类也泛型:

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

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

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

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

如果你正在为应用程序中的所有视图模型创建一个基本视图模型,那么每个单独的将不太可能包含一个可观察集合。

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

例如:

// 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.
    // ...
}

定义一些{Entity}类,可以作为Car和Person的基类:你将得到你想要的+强类型

你想让你的基类成为泛型

然后你可以有一个像这样的定义

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

如果你想要一个视图模型列表,那么我建议创建一个非泛型基类,泛型基类继承,并有一个列表

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

那么你可以有一个

ObservableCollection<NonGenericBaseViewModel> 

如果你想