我在。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.cs
的VerticalStackLayout
中添加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
类实际上缺少属性,或者该属性没有正确定义,但我们看不到该代码。