我在 .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>
知道是什么原因造成的嗎?
uj5u.com熱心網友回復:
根據您的代碼,我創建了一個演示,它在我這邊正常作業。
您可以參考以下代碼:
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;
}
車輛.cs
public class Vehicle
{
public string Make { get; set; }
}
主頁.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);
}
}
同時,洗掉_vm.Init();方法中的代碼OnAppearing():
protected override void OnAppearing()
{
base.OnAppearing();
//_vm.Init();
}
3.添加x:DataType_VerticalStackLayoutMainPage.xaml.cs
<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"
uj5u.com熱心網友回復:
編譯器在確定系結到資料模板的項的資料型別時可能存在問題。
您可能需要為您設定 x:DataTypeDataTemplate以便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類實際上缺少該屬性,或者該屬性未正確定義,但我們看不到該代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/488541.html
標籤:C# xamarin xamarin.forms 虚拟机 毛伊岛
