MVVM基础视图模型类

6
我正在创建一个基础视图模型类。ViewModelBase是一个抽象类,我想定义我希望所有其他派生视图模型实现的属性。
其中一个属性是ObservableCollection:
public abstract ObservableCollection<???> Items { get; set; }

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

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

这是正确的方法吗?

5个回答

11

我不太确定为什么您希望让它变得这么通用,但如果您确实想要这样做,我建议您将抽象基类也设为通用:

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

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


谢谢你。我简直不敢相信我完全忘记了泛型。我这样做的原因是因为我的许多视图模型几乎完全相同,除了一些细微的差异,所以我想把共同的东西放在基类中。 - Flack

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

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

2

如果您正在为应用程序中的所有视图模型创建基础视图模型,则不太可能每个视图模型都持有可观察集合。

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

例如:

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

0

您想将基类设置为通用类型

那么您可以这样定义

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

如果您想要一个ViewModel列表,我建议创建一个非泛型的基类,让泛型类继承它并拥有该列表。
public abstract  class NonGenericBaseViewModel
{
   ObservableCollection<object> ItemsAsObjects{get;set;}
}

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

那么你就可以拥有一个

ObservableCollection<NonGenericBaseViewModel> 

如果你想要


0
定义一个类{Entity},可以作为Car和Person的基类:您将获得所需的内容+强类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接