在 mvvm 结构中处理继承相同基类的类

问题描述 投票:0回答:1

我在 .NET MAUI 应用程序中设置了 MVVM 结构。

我的模型结构如下:

public partial class Animal
{
    public string Name { get; set; }
}

public class Bird : Animal
    {
        public string Color { get; set; }
    }

public class Fish : Animal
    {
        public int FinCount { get; set; }
    }

现在我有一个视图,它查看包含

List<Animals>
的视图模型 并将其显示给用户。现在,当用户单击列表中的某个项目时, 应用程序调用将视图更改为“DetailView”的命令,并且 将单击的元素传递到详细视图。

详细视图模型有一个

[ObservableProperty] Animal detailedAnimal

是否可以在 XAML 中区分

Bird
Fish
类? 根据动物的种类,我希望视图显示不同的控制元素。 目前,这是通过在从列表视图应用查询属性时设置可观察属性来实现的。根据这一点,我设置了不同的可见元素。

我不想检查类并将其特定属性移动到单独的可观察属性中,然后显示在详细视图中。

但是,详细信息视图的 XAML 中是否有一种方法可以解决此列表中不同类型对象的属性,或者最好为继承的每个类创建单独的视图和视图模型

Animal
,以及当我单击列表中的元素时调用正确的视图模型?

谢谢!

c# .net mvvm maui
1个回答
0
投票

正如 Jason 建议的那样,您可以使用 DataTemplateSelector

以下是示例代码,您可以参考:

public abstract class Animal
{
        public enum Types { Bird, Fish }
        public abstract Types Type { get; }
        public string Name { get; set; }
}

public class Bird : Animal
{
        public override Types Type => Types.Bird;
        public string Color { get; set; }
}

public class Fish : Animal
{
        public override Types Type => Types.Fish;
        public int FinCount { get; set; }
}

public class AnimalDataTemplateSelector : DataTemplateSelector
{
        public DataTemplate Bird { get; set; }

        public DataTemplate Fish { get; set; }

        protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
        {
            var obj = (Animal)item;

            if (obj.Type == Animal.Types.Bird)
            {
                return Bird;
            }
            else
            {
                return Fish;
            }
        }
}

© www.soinside.com 2019 - 2024. All rights reserved.