绑定到Entry.Text的属性的字母无限循环

问题描述 投票:1回答:3

这让我发疯。我一直在寻找问题的根源已有好几个小时,但是我开始怀疑这不是我的逻辑问题……也许我错了。


问题描述

我有一个简单的Entry。其Text属性绑定到ViewModel中类型为[[double的属性。同时,我订阅了Unfocused Event,其EventHandler只是将entry.Text属性设置为"1.0"(实际上,我可以重现x.y0的问题,即它的任何十进制最后一位是0)。如果现在我在Entry中写任何东西(“ 1”,“ 1”或“ 1.0”除外!!!!!!)并留下Entry(通过在外部点击或在Done上点击),以便[ C0]被触发,App变得无响应。

注意:

我知道在事件处理程序中设置Unfocused听起来有些奇怪。事实是,我通过尝试按如下格式设置entry.Text = 1.0值来遇到此问题。entry.Text
[if (double.TryParse(entry.Text, out double result))
{
    entry.Text = String.Format("{0:F2}", result);
}
试图将小数点舍入为两个小数点。如果我给String.Format,则期望值应为6.999,但

App

会变得无响应。
重现问题的步骤

    创建空白
  1. Xamarin.Forms

项目。删除
  • MainPage.xaml
  • 文件中的默认标签,以包括以下条目,而不是:7.00
      在后面的代码中添加以下
    1. EventHandler
    并按如下所示设置页面的<StackLayout> <Entry Text="{Binding Weight}" Unfocused="entry_Unfocused"/> </StackLayout> 属性:BindingContext
      创建
    1. ViewModel
    如:public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } protected override void OnAppearing() { base.OnAppearing(); BindingContext = new viewmodel(); } private void entry_Unfocused(object sender, FocusEventArgs e) { ((Entry)sender).Text = "1.0"; } }
      运行应用程序,然后在
    1. Entry
    中键入任何内容。留下
  • Entry
  • ,以便触发public class viewmodel : INotifyPropertyChanged { public viewmodel() { } private double _Weight; public double Weight { get => _Weight; set { if (_Weight != value) { _Weight = value; OnPropertyChanged(); } } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName] String propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
    我的系统配置:

      Visual Studio v。16.3.8
    • Xamarin.Forms 4.2.0.709249
    • Android 8


  • 任何人都可以解释这里发生了什么,还是要解决此问题?
  • c# xamarin.forms xamarin.android double string.format
    3个回答
    2
    投票
    我测试您的代码,并对其进行调试,我发现它会无限循环进入

    Unfocused

    我认为这是因为您的set
        {
            if (_Weight != value)
            {
                _Weight = value;
                OnPropertyChanged();
            }
        }
    }
    属性是Weight类型,无法将其正确设置为double,您可以尝试将Weight定义为字符串。

    string


    0
    投票
    可能是因为您的不专心的处理程序使用输入的值来设置条目,从而导致循环。

    private string _Weight; public string Weight { get => _Weight; set { if (_Weight != value) { _Weight = value; OnPropertyChanged(); } } }


    0
    投票
    我找到了问题的出处!
    © www.soinside.com 2019 - 2024. All rights reserved.