Я настроил структуру MVVM в приложении .NET MAUI.
Мои модели структурированы следующим образом:
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.
Можно ли отличить классы Bird и Fish в XAML?
В зависимости от того, что это за животное, я хочу, чтобы в представлении отображались разные элементы управления.
В настоящее время это реализуется путем установки наблюдаемого свойства при применении атрибута запроса из представления списка. в зависимости от этого я устанавливаю видимыми разные элементы.
Я не хочу проверять класс и перемещать его конкретные свойства в отдельные наблюдаемые свойства, чтобы затем отображать их в подробном представлении.
Но есть ли способ в XAML подробного представления обращаться к свойствам различных типов объектов, которые могут быть в этом списке, или лучше создать отдельное представление и модель представления для каждого класса, который наследует Animal, и вызвать правильный модель просмотра, когда я нажимаю элемент в списке?
Спасибо!
В WPF вы должны определить DataTemplate для каждого подкласса Animal без {x:Key}, но без DataType. Тогда правильный шаблон будет выбран автоматически. Но, как ни крути, на Мауи это не работает.
DataTemplateSelector , Converter или Trigger. chat.openai.com/share/8937d06b-9b76-4952-b3bd-053e0cde0eb7
На вашем месте я бы просто проверял во время выполнения тип данных, которые я получаю, и на основе этого назначал правильное представление.





Как предложил Джейсон, вы можете использовать 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;
}
}
}
вы можете использовать DataTemplateSelector