Я хочу отобразить список (наблюдаемую коллекцию) типа BleDevice в моем представлении. Я использую шаблон mvvm в .net maui (.net 7).
Модель:
public class BleDevice
{
public BleDevice(){}
public BleDevice(string name, string mac)
{
Name = name;
MacAddress = mac;
}
public string Name { get; set; }
public string MacAddress { get; set; }
}
ViewModel:
public partial class MainViewModel: ObservableObject
{
public MainViewModel()
{
devices = new ObservableCollection<BleDevice>();
devices.Add(new BleDevice("Mystronics Winder", "00:00:00:00:00"));
devices.Add(new BleDevice("Living Room TV", "25:e7:aa:05:84"));
}
[ObservableProperty]
ObservableCollection<BleDevice> devices;
}
Вид (xaml): (отредактировано)
<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
x:Class = "MauiApp2.MainPage"
xmlns:viewmodel = "clr-namespace:MauiApp2.ViewModel"
xmlns:model = "clr-namespace:MauiApp2.Model"
x:DataType = "viewmodel:MainViewModel">
<VerticalStackLayout>
<CollectionView ItemsSource = "{Binding Devices}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType = "{model:BleDevice}">
<Grid>
<Label Text = "{Binding Name}"/>
<Label Text = "{Binding MacAddress}"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</VerticalStackLayout>
</ContentPage>
Ошибка: XFC0045 Binding: Property "Name" not found on "MauiApp2.ViewModel.MainViewModel". MauiApp2 \source\repos\MauiApp2\MauiApp2\View\MainPage.xaml
Почему он распознает "{Binding Devices}", но не "{Binding Name}" и "{Binding MacAddress}"?
Не связанное с этим примечание: свойство Devices не обязательно должно иметь атрибут [ObservableProperty], поскольку оно является ObservableCollection. ObservableCollection сам уведомит пользовательский интерфейс о любых изменениях в коллекции (добавление, удаление и т. д.).
Если вы удалите атрибут, им нужно будет явно сделать его общедоступным
@ Джейсон, это правильно? <DataTemplate x:DataType = "{model:BleDevice}"> Я все еще получаю ту же ошибку.
Нет. Посмотрите, как отформатирован другой DataType у вас на странице.
@Jason Тип данных основной страницы содержимого определяется следующим образом xmlns:viewmodel = "clr-namespace:MauiApp2.ViewModel" x:DataType = "viewmodel:MainViewModel" для доступа к модели представления. (ps: извините, я нуб-разработчик в .net)
Посмотрите на две разные DataType декларации. Чем отличается тот, который НЕ работает?
@Jason Это была опечатка. все равно спасибо за помощь :)
Вы также можете обратиться к официальному документу о CollectionView. Это может быть полезно для вас.
ViewModel Удалите атрибут [ObservableProperty] и измените его на этот:
public partial class MainViewModel : ObservableObject
{
public MainViewModel()
{
Devices = new ObservableCollection<BleDevice>();
Devices.Add(new BleDevice("Mystronics Winder", "00:00:00:00:00"));
Devices.Add(new BleDevice("Living Room TV", "25:e7:aa:05:84"));
}
public ObservableCollection<BleDevice> Devices { get; set; }
}
View(xaml) Удалите x:DataType = "xxx":
<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
x:Class = "MauiApp2.MainPage"
xmlns:viewmodel = "clr-namespace:MauiApp2.ViewModel"
xmlns:model = "clr-namespace:MauiApp2.Model"
>
<VerticalStackLayout>
<CollectionView ItemsSource = "{Binding Devices}">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Label Text = "{Binding Name}"/>
<Label Text = "{Binding MacAddress}"/>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</VerticalStackLayout>
</ContentPage>
Вам нужно либо добавить атрибут DataType к вашему DataTemplate, либо удалить тот, который у вас уже есть в другом месте вашей страницы.