Я разрабатываю приложение для Мауи. Я использую структуру MVVM и набор инструментов MVVM Community для облегчения жизни. Теперь я столкнулся с проблемой при отображении ListView, который привязан к ObservableCollection в My Viewmodel.
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
x:Class = "WaiterEval.Views.UserList"
xmlns:toolkit = "http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:vm = "clr-namespace:WaiterEval.ViewModels"
x:DataType = "vm:UserList_ViewModel">
<VerticalStackLayout>
<ListView x:Name = "userList" ItemsSource = "{Binding Users}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding = "10">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "0.5*" />
<ColumnDefinition Width = "0.25*" />
<ColumnDefinition Width = "0.25*" />
</Grid.ColumnDefinitions>
<Label Grid.Row = "0" Grid.Column = "0" Text = "{Binding }" />
<Label
Grid.Row = "0"
Grid.Column = "1"
Text = "{Binding Test}" />
<Label
Grid.Row = "0"
Grid.Column = "2"
Text = "Edited" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</ContentPage>
namespace WaiterEval.ViewModels
{
public partial class UserList_ViewModel : ObservableObject
{
[ObservableProperty]
public ObservableCollection<User> users = new ObservableCollection<User>();
private readonly MyDbContext _dbContext;
public UserList_ViewModel(MyDbContext dbContext)
{
_dbContext = dbContext;
addUsers();
}
public async void addUsers()
{
try
{
Users = new ObservableCollection<User>(await _dbContext.Users.OfType<User>().ToListAsync());
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}
Коллекция заполняется данными после выхода из конструктора.
namespace WaiterEval.Views;
public partial class UserList : ContentPage
{
public UserList(UserList_ViewModel vm)
{
InitializeComponent();
BindingContext = vm;
}
}
При попытке привязать что-то в ListCell контекстом данных является ViewModel, а не список, как должно быть. Я не могу получить доступ ни к каким свойствам пользователя. Где я здесь не прав?
Тогда страница не связана с моей ViewModel, и я не могу получить доступ к «пользователям» коллекции.
Вы можете попробовать добавить x:DataType = "User" для ListView <DataTemplate>.
Возвращает ошибку: «Имя «Пользователь» не существует в пространстве имен «Schemas.microsoft.com/dotnet/2021/maui»».
Поскольку вы не добавляете ссылку на пространство имен для пользователя, вы можете ссылаться на нее так же, как на UserList_ViewModel. Пожалуйста, проверьте мой ответ.





x:DataType = "vm:UserList_ViewModel" в <ContentPage> привяжет ContentPage и дочернее представление к типу UserList_ViewModel.
Вы можете объявить тип данных для элемента DataTemplate элемента ListView, чтобы привязать элемент к типу пользователя:
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
x:Class = "WaiterEval.Views.UserList"
xmlns:toolkit = "http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:vm = "clr-namespace:WaiterEval.ViewModels"
xmlns:models = "clr-namespace:WaiterEval.Models"
x:DataType = "vm:UserList_ViewModel">
<VerticalStackLayout>
<ListView x:Name = "userList" ItemsSource = "{Binding Users}">
<ListView.ItemTemplate>
<DataTemplate x:DataType = "models:User">
....
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</ContentPage>
Вы пытались удалить
x:DataType = "vm:UserList_ViewModel"в теге содержимого страницы?