mvvm - 通用 ViewModel 类的 ObservableCollection

标签 mvvm viewmodel generics observablecollection

我正在创建 MVVM 应用程序,在模型部分我有简单的基本抽象类 动物 和类(class)源于它:

public abstract class Animal
{
    public int Age { get; set; }
}

public class Dog : Animal
{
    public string Name { get; set; }
}

ViewModel 部分包含 UI 友好的 虚拟机 他们的类别:
public abstract class AnimalVM<T> : ViewModelBase where T : Animal
{
    protected readonly T animal;

    public int Age
    {
        get { return animal.Age; }
        set
        {
            animal.Age = value;
            OnPropertyChanged("Age");
        }
    }

    protected AnimalVM(T animal)
    {
        this.animal = animal;
    }
}

public class DogVM : AnimalVM<Dog>
{
    public string Name
    {
        get { return animal.Name; }
        set
        {
            animal.Name = value;
            OnPropertyChanged("Name");
        }
    }

    public DogVM(Dog dog) : base(dog) { }
}

假设我有另一个 虚拟机 包含 ObservableCollection<AnimalVM> 的类.问题是如何创建允许我存储不同类型的 的属性。动物 ?我想实现这样的目标:
public class AnimalListVM : ViewModelBase
{
    // here is a problem, because AnimalVM<Animal> isn't compatible with DogVM
    readonly ObservableCollection<AnimalVM<Animal>> animals;
    public ObservableCollection<AnimalVM<Animal>> Animals
    {
        get { return animals; }
    }

    public AnimalListVM(IList<Animal> animals)
    {
        //this.animals = ...            
    }
}

我可以改变ObservableCollection<AnimalVM<Animal>>属性(property)给 ICollection属性,然后创建 的列表动物虚拟机 使用一些字典 Animal -> AnimalVM wrapper 和 Activator.CreateInstance() - 它有效,但是当我尝试扩展 AnimalListVM 添加另一个属性时 SelectedAnimal它将在示例 View 中绑定(bind)到例如DataGrid 控件我对那种属性的类型有另一个问题SelectedItem .它不能是 AnimalVM<Animal> 类型因为当我有 狗虚拟机 我的 Collection 中的对象不适合这个并引发异常。

如果我有非泛型 AnimalVM,一切都会很清楚,但我不想在从 AnimalVM 派生的每个 DogVM、CatVM、BirdVM 类中复制和粘贴类似的属性。我怎样才能做到这一点?

最佳答案

好的,我找到了一个解决方案,当然它非常简单:只需为您的泛型抽象基类创建另一个非泛型抽象基类,然后从新创建的非泛型类派生您的泛型类。在这种情况下,您还必须将属性从非泛型类重写为泛型类(更具体地说,覆盖它们),但您只需执行一次,因此您不必在每个泛型派生 ViewModel 中复制和粘贴相同的代码(在我们的每个 DogVM、CatVM、BirdVM 等示例中)。

关于mvvm - 通用 ViewModel 类的 ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207019/

相关文章:

wpf - 将 WPF TreeView 与通用 View 模型绑定(bind)

.net - 确保每个子 UserControl 创建自己的 ViewModel 实例

android - 带 LiveData 的 ViewModel 与不带 LiveData 的 ViewModel 有何不同?

xaml - 使用 MvvmCross 在 UWP 应用程序中打开新窗口

c# - 视觉效果应该在 View 还是 ViewModel 中实现?

c# - 使用 IEnumerable<T> 创建通用集合的通用类

swift - 是否可以在 Swift 中创建具有 Self 或关联类型要求的通用计算属性,如果可以,如何创建?

java - 如何使用 java 创建通用且可重用的代码

c# - MVVM、ViewModelLocator、根据属性动态显示View和ViewModel

MvvmCross:应用程序范围的 View 模型?