我有一个Model类Person
,它有一些字符串属性。在UI中,有一些Entry
字段,当按下按钮时,在ViewModel类中执行以下操作:
- 创建一个
Person
对象,该对象的值来自填充对象属性的字段 - 将
Person
对象添加到ObservableList<Person>
中,ObservableList<Person>
本身是在ViewModel类的构造函数中创建的
然后,我尝试在CollectionView
列表中显示Person
对象的一些属性。字符串值的列表。我希望它看起来像这样:
我知道正在创建Person
对象,并且正在填充ObservableList<Person>
列表,因为我可以在单步执行代码时看到这些值。
Person.cs
namespace BindingDemo.Model
{
public partial class Person : ObservableObject
{
#region PersonObjectProperties
[ObservableProperty]
private string firstName;
[ObservableProperty]
private string lastName;
[ObservableProperty]
private string email;
[ObservableProperty]
private string password;
#endregion PersonObjectProperties
public void ClearFields()
{
FirstName = string.Empty;
LastName = string.Empty;
Email = string.Empty;
Password = string.Empty;
}
}
}
ViewModel类:
using BindingDemo.Model;
namespace BindingDemo.ViewModel
{
public partial class MainPageViewModel : ObservableObject
{
public Person Person { get; } = new Person();
[ObservableProperty]
private ObservableCollection<Person> persons;
public MainPageViewModel()
{
persons = new ObservableCollection<Person>();
}
[RelayCommand]
private void AddPersonToListAndDb()
{
// every field must have a value
if (string.IsNullOrWhiteSpace(Person.FirstName) ||
string.IsNullOrWhiteSpace(Person.LastName) ||
string.IsNullOrWhiteSpace(Person.Email) ||
string.IsNullOrWhiteSpace(Person.Password))
return;
// add the Person object to the list of Person objects
Persons.Add(Person);
// clear the fields in the UI so the user can add another person
Person.ClearFields();
// add the Person object to a database
}
}
}
视图类:
<?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="BindingDemo.MainPage"
Title="Create Person"
xmlns:viewmodel="clr-namespace:BindingDemo.ViewModel"
x:DataType="viewmodel:MainPageViewModel">
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto,*"
Margin="10">
<Entry Grid.Row ="0"
Placeholder="Enter your first name"
PlaceholderColor="DarkGoldenrod"
FontAttributes="Bold"
Text="{Binding Person.FirstName}" />
<Entry Grid.Row="1"
Placeholder="Enter your last name"
PlaceholderColor="DarkGoldenrod"
FontAttributes="Bold"
Text="{Binding Person.LastName}" />
<Entry Grid.Row="2"
Placeholder="Enter your email address"
PlaceholderColor="DarkGoldenrod"
FontAttributes="Bold"
Text="{Binding Person.Email}" />
<Entry Grid.Row="3"
Placeholder="Enter your password"
PlaceholderColor="DarkGoldenrod"
FontAttributes="Bold"
IsPassword="True"
Text="{Binding Person.Password}" />
<Button Grid.Row="4"
Margin="10"
Text="Add to Database"
FontAttributes="Bold"
HorizontalOptions="Center"
Command="{Binding AddPersonToListAndDbCommand}"/>
<CollectionView Grid.Row="5"
ItemsSource="{Binding Persons}">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Margin="5">
<HorizontalStackLayout>
<Label Text="First name:" />
<Label Text="{Binding Person.FirstName}" />
</HorizontalStackLayout>
<HorizontalStackLayout>
<Label Text="Last name:" />
<Label Text="{Binding Person.LastName}" />
</HorizontalStackLayout>
<HorizontalStackLayout>
<Label Text="Email address: " />
<Label Text="{Binding Person.Email}" />
</HorizontalStackLayout>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
</ContentPage>
这个问题很可能是在绑定中,但我不知道还能尝试什么。
在调试时,我将鼠标悬停在Text={Binding Person.FirstName}
上以查看Person.FirstName
的值。如果我将鼠标悬停在Person
上,我可以深入到对象中,所有正确的值都在那里,但是当我将鼠标悬停在FirstName
上时,它给出错误children could not be evaluated
。
为了说明正在创建Person
对象的列表,这里有一个手表的图像,在我创建了一些对象并将它们放入列表之后:
编辑:这是我的MainPage.xaml.cs代码:
using BindingDemo.ViewModel;
namespace BindingDemo
{
public partial class MainPage : ContentPage
{
public MainPage(MainPageViewModel mainPageViewModel)
{
InitializeComponent();
BindingContext = mainPageViewModel;
}
}
}
1条答案
按热度按时间insrf1ej1#
因为您的
ItemsSource
是IEnumerable<Person>
,所以CollectionView
的每一行都有当前Person
对象的BindingContext
这意味着
DataTemplate
中的绑定表达式将相对于Person
对象,即但是,由于使用的是编译绑定,因此还需要指定
DataType
还需要为
model
添加xmlns
声明