我在 .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
,以及当我单击列表中的元素时调用正确的视图模型?
谢谢!
正如 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;
}
}
}