[英]Xamarin Forms Freezes on Binding to text property of Enrty
不知道这是怎么发生的,但是我的两个 Entry 元素会在它们的 Text 被绑定时冻结整个应用程序。 它们看起来与在应用程序中使用的任何其他条目基本相同,唯一的区别是,当包含应用程序时,应用程序会冻结。 为什么这些会中断是没有意义的,但其他设置完全相同的却不会。 任何帮助,建议或建议表示赞赏!
违规条目:
<Label Margin="3">Professor Phone</Label>
<Entry Text="{Binding ProfessorPhone}" Placeholder="Professor Email" Margin="3" />
<Label Margin="3">Professor Email</Label>
<Entry Text="{Binding ProfessorEmail}" Placeholder="Professor Phone" />
看法:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="TermManager.Views.CourseDetailView">
<ContentPage.ToolbarItems>
<ToolbarItem Text="Update" />
</ContentPage.ToolbarItems>
<ContentPage.Content>
<ScrollView>
<StackLayout>
<Label Text="Course Details" VerticalOptions="Center" HorizontalTextAlignment="Center" IsVisible="true" FontSize="Large" FontAttributes="Bold" TextColor="DarkBlue" Margin="10" />
<Label Margin="3">Course Title</Label>
<Entry Text="{Binding CourseTitle}" Placeholder="Course Title" Margin="3" />
<Label Margin="3">Start Date</Label>
<DatePicker Date="{Binding StartCourseDate}" Margin="3" />
<Label Margin="3">End Date</Label>
<DatePicker Date="{Binding EndCourseDate}" Margin="3" />
<Picker SelectedItem="{Binding CourseStatus}" Title="Course Status" Margin="3" TitleColor="DarkBlue">
<Picker.ItemsSource>
<x:Array Type="{x:Type x:String}">
<x:String>in progress</x:String>
<x:String>completed</x:String>
<x:String>dropped</x:String>
<x:String>plan to take</x:String>
</x:Array>
</Picker.ItemsSource>
</Picker>
<Label Margin="3">Professor Name</Label>
<Entry Text="{Binding ProfessorName}" Placeholder="Professor's Name" Margin="3" />
<Label Margin="3">Professor Email</Label>
<Entry Text="{Binding ProfessorPhone}" Placeholder="Professor Email" Margin="3" />
<Label Margin="3">Professor Phone</Label>
<Entry Text="{Binding ProfessorEmail}" Placeholder="Professor Phone" />
</StackLayout>
</ScrollView>
</ContentPage.Content>
代码背后:
using System;
using System.Collections.Generic;
using TermManager.Models;
using TermManager.ViewModels;
using Xamarin.Forms;
namespace TermManager.Views
{
public partial class CourseDetailView : ContentPage
{
protected Course Course = new Course();
public CourseDetailView(Course course)
{
InitializeComponent();
BindingContext = new CourseDetailViewModel(Navigation, course);
}
}
}
视图模型:
using System;
using Xamarin.Forms;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using TermManager.Models;
namespace TermManager.ViewModels
{
public class CourseDetailViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Command UpdateCourse { get; private set; }
protected readonly INavigation Nav;
protected int _courseId;
protected int _termId;
protected string _courseTitle;
protected DateTime _startCourseDate;
protected DateTime _endCourseDate;
protected string _courseStatus;
protected string _name;
protected string _email;
protected string _phone;
public int CourseId
{
get => _courseId;
set
{
_courseId = value;
OnPropertyChanged();
}
}
public int TermId
{
get => _termId;
set
{
_termId = value;
OnPropertyChanged();
}
}
public string CourseTitle
{
get => _courseTitle;
set
{
_courseTitle = value;
OnPropertyChanged();
}
}
public DateTime StartCourseDate
{
get => _startCourseDate;
set
{
_startCourseDate = value;
OnPropertyChanged();
}
}
public DateTime EndCourseDate
{
get => _endCourseDate;
set
{
_endCourseDate = value;
OnPropertyChanged();
}
}
public string CourseStatus
{
get => _courseStatus;
set
{
_courseStatus = value;
OnPropertyChanged();
}
}
public string ProfessorName
{
get => _name;
set
{
_name = value;
OnPropertyChanged();
}
}
public string ProfessorEmail
{
get => ProfessorEmail;
set
{
_email = value;
OnPropertyChanged();
}
}
public string ProfessorPhone
{
get => ProfessorPhone;
set
{
_phone = value;
OnPropertyChanged();
}
}
public CourseDetailViewModel(INavigation nav, Course course = null)
{
Nav = nav;
if (course != null)
{
_courseId = course.CourseId;
_termId = course.TermId;
_courseTitle = course.CourseTitle;
_courseStatus = course.CourseStatus;
_startCourseDate = course.StartCourseDate;
_endCourseDate = course.EndCourseDate;
_name = course.ProfessorName;
_email = course.ProfessorEmail;
_phone = course.ProfessorPhone;
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
问题出在ProfessorPhone
和ProfessorEmail
属性的getter 中,您必须返回受保护的字段,而是返回属性本身,这会导致无限循环!
更改您的代码如下:
public string ProfessorEmail
{
get => _email;
set
{
_email = value;
OnPropertyChanged();
}
}
public string ProfessorPhone
{
get => _phone;
set
{
_phone = value;
OnPropertyChanged();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.