MvvmCross Android EditText绑定不更新屏幕

Tre*_*com 5 c# zxing xamarin.android mvvmcross xamarin

我发现当使用MvvmCross版本3.5.1启用"不要保持活动"开发人员设置时,Mvvm Cross EditText绑定无法正常工作的情况.以下是重现的步骤:

  1. 使用NuGet的"入门"Mvvm Cross软件包创建一个新的Core&Droid项目.
  2. 从NuGet添加ZXing.Net.Mobile PCL组件.
  3. 实现ViewModel:

        public class FirstViewModel : MvxViewModel
        {
            private readonly IMobileBarcodeScanner _mobileBarcodeScanner;
    
            public FirstViewModel(IMobileBarcodeScanner mobileBarcodeScanner)
            {
                _mobileBarcodeScanner = mobileBarcodeScanner;
            }
    
            private string _barCode = "";
            public string BarCode
            { 
                get { return _barCode; }
                set { _barCode = value; RaisePropertyChanged(() => BarCode); }
            }
    
            private MvxCommand _scanBarCodeCommand;
            public IMvxCommand ScanBarCodeCommand
            {
                get
                {
                    return _scanBarCodeCommand ?? (_scanBarCodeCommand = new MvxCommand(async () => await OnScanBarCode()));
                }
            }
    
            private async Task OnScanBarCode()
            {
                var result = await _mobileBarcodeScanner.Scan();
                if (result != null && !string.IsNullOrEmpty(result.Text))
                {
                    InvokeOnMainThread(() =>
                    {
                        BarCode = result.Text;
                    });
                }
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 实现视图:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:local="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            local:MvxBind="Text BarCode" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Scan"
            local:MvxBind="Click ScanBarCodeCommand" />
    </LinearLayout>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在视图中初始化ZXing.Net.Mobile库:

    [Activity(Label = "View for FirstViewModel")]
    public class FirstView : MvxActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.FirstView);
            MobileBarcodeScanner.Initialize(Application);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 运行应用程序并扫描条形码.如果您没有方便的条形码,您可以使用此Barcodesinc条形码生成器并从显示器进行扫描.扫描的条形码应出现在EditText.
  7. 通过添加一个android:id来编辑View XML EditText.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:local="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <EditText
            android:id="@+id/scan_text"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            local:MvxBind="Text BarCode" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Scan"
            local:MvxBind="Click ScanBarCodeCommand" />
    </LinearLayout>
    
    Run Code Online (Sandbox Code Playgroud)
  8. 重建并运行应用程序. 现在扫描的条形码没有显示EditText.唯一的变化是给予EditTextandroid:id.有谁理解为什么添加android:id会破坏MvvmCross数据绑定?

Mar*_*n00 2

仅为 TextEdit 添加绑定,而不为 EditText 添加绑定。请参阅此处的实现:https://github.com/MvvmCross/MvvmCross/blob/4.0/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxAndroidBindingBuilder.cs#L85

您可以添加自定义绑定,如下所述:

  • “EditText”继承自“TextView”,因此它适用于两者,并且绑定“Text”属性确实适用于“EditText”。它正在我的多个应用程序中运行,并加载 MvvmCross-Tutorials 中的示例。所以问题不在于那里。 (5认同)
  • @Cheesebaron 我已经弄清楚如何重现这个问题。如果 EditText 有 android:id 则绑定失败。如果 EditText 没有 android:id,则绑定将按预期工作。你知道那是什么意思吗?即,我在这里做的事情是否不正确,或者这可能是 MvvmCross 绑定框架中的错误? (3认同)