Eu sou novo em .NET MAUI/MVVM/SQLite e em C#. Estou tentando utilizar meu ViewModel para vincular dados da minha classe de modelo. Posso usar o namespace do modelo como minha propriedade de ligação perfeitamente e ele mostra os dados em meu listview. Assim que tento usar meu ViewModel, ele não é mais exibido.
CRUDView XAML funcionando
<Frame Grid.Row="6" Grid.Column="1" Grid.ColumnSpan="3" BackgroundColor="#B1C0C9" BorderColor="#7989A3">
<ScrollView Orientation="Vertical">
<ListView x:Name="listView"
BackgroundColor="Gray"
HasUnevenRows="True"
SeparatorVisibility="Default"
ItemTapped="listView_ItemTapped"
FlexLayout.Grow="1"
>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<VerticalStackLayout Padding="5">
<Label Text="{Binding Question}"
FontSize="17"
FontFamily="OCRA"
TextColor="Black"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Label Text="{Binding Id}"
FontSize="10"
FontFamily="OCRA"
TextColor="Black"
Grid.Column="0"
/>
<Label Text="{Binding Answer}"
FontSize="15"
FontFamily="OCRA"
TextColor="White"
Grid.Column="1"
Padding="10"/>
<Label Text="{Binding Difficulty}"
FontSize="15"
FontFamily="OCRA"
TextColor="Black"
Grid.Column="3"
Padding="10"/>
</Grid>
</VerticalStackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ScrollView>
</Frame>
Quando volto a usar o ViewModel para vinculação de dados:
CRUDViewXAML
<Frame Grid.Row="6" Grid.Column="1" Grid.ColumnSpan="3" BackgroundColor="#B1C0C9" BorderColor="#7989A3">
<ScrollView Orientation="Vertical">
<ListView x:Name="listView"
BackgroundColor="Gray"
HasUnevenRows="True"
SeparatorVisibility="Default"
ItemTapped="listView_ItemTapped"
FlexLayout.Grow="1"
ItemsSource="{Binding Flashcards}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="vm:CRUDViewModel">
<ViewCell>
<VerticalStackLayout Padding="5">
<Label Text="{Binding Flashcard.Question}"
FontSize="17"
FontFamily="OCRA"
TextColor="Black"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Label Text="{Binding Flashcard.Id}"
FontSize="10"
FontFamily="OCRA"
TextColor="Black"
Grid.Column="0"
/>
<Label Text="{Binding Flashcard.Answer}"
FontSize="15"
FontFamily="OCRA"
TextColor="White"
Grid.Column="1"
Padding="10"/>
<Label Text="{Binding Flashcard.Difficulty}"
FontSize="15"
FontFamily="OCRA"
TextColor="Black"
Grid.Column="3"
Padding="10"/>
</Grid>
</VerticalStackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ScrollView>
</Frame>
Modelo de visualização
namespace cadflash.ViewModels
{
public partial class CRUDViewModel : ObservableObject
{
[ObservableProperty]
public ObservableCollection<Flashcard> flashcards = new();
[ObservableProperty]
public Flashcard flashcard = new();
public CRUDViewModel()
{
Flashcard = new Flashcard();
Flashcards = [];
}
Programa Maui
MauiProgram
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkit()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
fonts.AddFont("OCRAEXT.ttf", "OCRA");
});
builder.Services.AddSingleton<LocalDbService>();
builder.Services.AddTransient<HomeView>();
builder.Services.AddTransient<DifficultyView>();
builder.Services.AddTransient<CRUDView>();
builder.Services.AddTransient<CRUDViewModel>();
builder.Services.AddTransient<DifficultyViewModel>();
builder.Services.AddTransient<HomeViewModel>();
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder.Build();
}
}
}
CRUDView.cs
CRUDView.xaml.cs
public partial class CRUDView : ContentPage
{
CRUDViewModel viewModel;
private readonly LocalDbService localDbService; // This is the service that is used to interact with the local database
private int _editFlashcardId; // This is the ID of the flashcard that is being edited
public CRUDView(LocalDbService localDbService)
{
InitializeComponent();
BindingContext = new CRUDViewModel();
this.localDbService = localDbService;
Task.Run(async () => await localDbService.GetFlashcardsAsync());
}
protected override async void OnAppearing()
{
base.OnAppearing();
listView.ItemsSource = await localDbService.GetFlashcardsAsync();
}
Foi uma semana de dor agonizante tentando exibir os dados no listview. Hoje descobri como vincular os dados diretamente da classe do modelo. Idealmente, eu gostaria de usar a ligação ViewModel...
Existem alguns problemas com os usos no seu código.
Primeiro, como você tentou usar o MVVM, você precisa adicionar o código relativo
localDbService
ao seu modelo MVVM. Por exemplo, você pode adicionar olocalDbService
método de carregamento de dados ao modelo MVVM.Em segundo lugar, como você definiu
ItemsSource="{Binding Flashcards}"
para o seuListView
, o tipo de dados do ListView nãoDataTemplate
deve ser .Flashcard
<DataTemplate x:DataType="vm:CRUDViewModel">
Terceiro, remova o prefixo
Flashcard
durante a ligação (por exemplo<Label Text="{Binding Flashcard.Id}"
).Consegui esta função com alguns dados falsos.
Você pode consultar o seguinte código:
CRUDViewModel.cs
MainPage.xaml
MainPage.xaml.cs