可观察集合<MyModel>看不到属性



我在。net MAUI应用程序的CollectionView中使用的模型的属性之一是类。它看起来像这样:

public MyModel
{
public string Name { get; set; }
public Vehicle Car { get; set; } = new Vehicle();
}

我的视图模型是这样的:

public class MyViewModel : BaseViewModel
{
ObservableCollection<MyModel> data = new ObservableCollection<MyModel>();
public ObservableCollection<MyModel> Data
{
get => data;
set
{
if(data == value)
return;
data = value;
OnPropertyChanged();
}
}
}

在我的集合视图中,当我试图访问Car属性的一个属性时,这是一个Vehicle对象,我得到一个错误,告诉我没有找到该属性。

<CollectionView
Source={Binding Data}>
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Label
Text={Binding Car.Make} />
</StackLayout>
<DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>

你知道是什么引起的吗?

基于您的代码,我创建了一个演示,它在我这边可以正常工作。

你可以参考下面的代码:

MyViewModel.cs

public class MyViewModel: INotifyPropertyChanged
{
ObservableCollection<MyModel> data = new ObservableCollection<MyModel>();
public ObservableCollection<MyModel> Data
{
get => data;
set
{
if (data == value)
return;
data = value;
OnPropertyChanged();
}
}
public MyViewModel() {
Data = new ObservableCollection<MyModel>();
Data.Add(new MyModel { Name ="model_1", Car= new Vehicle {Make="Make1" } });
Data.Add(new MyModel { Name = "model_2", Car = new Vehicle { Make = "Make2" } });
Data.Add(new MyModel { Name = "model_3", Car = new Vehicle { Make = "Make3" } });
Data.Add(new MyModel { Name = "model_4", Car = new Vehicle { Make = "Make4" } });
}
bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (Object.Equals(storage, value))
return false;
storage = value;
OnPropertyChanged(propertyName);
return true;
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}

Vehicle.cs

public class Vehicle
{
public string Make { get; set; }
}

MainPage.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="MauiCollectionApp.MainPage"
xmlns:local="clr-namespace:MauiCollectionApp"
>
<ContentPage.BindingContext>
<local:MyViewModel></local:MyViewModel>
</ContentPage.BindingContext>

<CollectionView  ItemsSource="{ Binding Data}">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Label Text="{Binding Car.Make}" />
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</ContentPage>

更新:

我测试了你的演示,你的代码有一些问题。

1.定义Drivers如下:

public ObservableCollection<Driver> Drivers { get; set; } = new ObservableCollection<Driver>();

:

public ObservableCollection<Driver> Drivers = new();

2。我们应该在MainPageViewModel的构造函数中初始化数据,因此可以这样定义MainPageViewModel.cs:

public class MainPageViewModel : ObservableObject
{
//public ObservableCollection<Driver> Drivers = new();
public ObservableCollection<Driver> Drivers { get; set; } = new ObservableCollection<Driver>();
public MainPageViewModel() {
Init();
}
public void Init()
{
var car = new Vehicle
{
Make = "Subaru",
Model = "Outback",
Year = 2019
};
var driver = new Driver
{
Name = "John Smith",
Car = car
};
Drivers.Add(driver);
car = new Vehicle
{
Make = "Infiniti",
Model = "Q80",
Year = 2014
};
driver = new Driver
{
Name = "John Doe",
Car = car
};
Drivers.Add(driver);
car = new Vehicle
{
Make = "BMW",
Model = "535i",
Year = 2011
};
driver = new Driver
{
Name = "John Doe",
Car = car
};
Drivers.Add(driver);
}
}
同时,删除方法OnAppearing(): 中的代码_vm.Init();
protected override void OnAppearing()
{
base.OnAppearing();
//_vm.Init();
}

3。在MainPage.xaml.csVerticalStackLayout中添加x:DataType

<CollectionView.ItemTemplate>
<DataTemplate >
<VerticalStackLayout x:DataType="local:Driver">
<Label
Text="{Binding Name}"
TextColor="Black"/>
<Label
Text="{Binding Car.Make}"
TextColor="Black"/>
</VerticalStackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>

此外,在MainPage.xaml的根目录下添加以下代码:

xmlns:local="clr-namespace:MauiApp1"

编译器可能在确定绑定到数据模板的项的数据类型时遇到问题。

您可能需要将DataTemplate的x:DataType设置为MyModel,以便它知道哪些属性可用。

它看起来像:<DataTemplate x:DataType="MyModel">

查看修改后的代码:

<CollectionView
Source="{Binding Data}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="declaredNamespace:MyModel">
<StackLayout>
<Label
Text="{Binding Car.Make}" />
</StackLayout>
<DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>

如果它继续向您显示错误,您可能需要清理并重新构建解决方案,以便生成必要的文件和引用。除此之外,它可能是您的Vehicle类实际上缺少属性,或者该属性没有正确定义,但我们看不到该代码。