Estou tentando usar um controle personalizado com tipo genérico em BindableProperty assim:
public partial class Overview : ContentView
{
public static readonly BindableProperty AnimalsProperty =
BindableProperty.Create(nameof(AnimalsProperty), typeof(ObservableRangeCollection<IAnimal>), typeof(Overview), null);
public ObservableRangeCollection<IAnimal> Animals
{
get { return (ObservableRangeCollection<IAnimal>)GetValue(AnimalsProperty); }
set { SetValue(AnimalsProperty, value); }
}
}
public interface IAnimal {}
public partial class Dog: ObservableObject, IAnimal {}
Visão geral do cão xaml:
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DogOverview"
>
<Grid>
<local:Overview
Animals="{Binding Dogs}"
/>
</Grid>
</ContentView>
public partial class DogViewModel: ObservableObject
{
[ObservableProperty]
private ObservableRangeCollection<Dog> _dogs = [];
}
E quando eu uso BindableContext em DogOverview
algo como:
public partial class DogOverview : ContentView
{
public DogOverview(DogViewModel vm)
{
InitializeComponent();
BindingContext = vm;
}
}
Há um erro na linha BindingContext = vm
: **System.InvalidCastException:** 'Object must implement IConvertible.'
. Eu verifiquei e isso aconteceu porque eu uso IAnimal
em BindableProprety. Eu só quero criar um controle personalizado com tipo genérico e usá-lo em outro ContentPage
, isso é possível?
Provavelmente você
BindableProperty
pode ser reduzido a umIEnumerable<object>
ou outroIEnumerable<IAnimal
:Eu provavelmente adicionaria
INotifyPropertyChanged
à suaIAnimal
interface:Quanto à implementação de
Dogs
, não há necessidade deCommunityToolkit.Mvvm
. Isso ocorre porque ObservableCollections são atribuídos uma vez e são seus eventos CollectionChanged que buscamos, ou seja,