我发现一种情况,当使用MvvmCross版本3.5.1启用“不保留事件”开发人员设置时,Mvvm跨EditText绑定(bind)无法正常工作。以下是重现步骤:

  • 使用来自NuGet的“入门” Mvvm Cross软件包创建一个新的Core&Droid项目。
  • 从NuGet添加ZXing.Net.Mobile PCL组件。
  • 实现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;
                    });
                }
            }
        }
    
  • 实现 View :
    <?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>
    
  • 在 View 中初始化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);
        }
    }
    
  • 运行该应用程序并扫描条形码。如果您没有任何方便的条形码,则可以使用此Barcodesinc bar code generator并从监视器进行扫描。扫描的条形码应显示在EditText中。
  • 通过将android:id添加到EditText来编辑View XML。
    <?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>
    
  • 重建并运行该应用程序。 现在,扫描的条形码未在EditText中显示。唯一的变化是提供了EditTextandroid:id。有谁知道为什么添加android:id会破坏MvvmCross数据绑定(bind)?
  • 最佳答案

    绑定(bind)仅为TextEdit添加,而不为EditText添加。在此处查看实现:https://github.com/MvvmCross/MvvmCross/blob/4.0/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxAndroidBindingBuilder.cs#L85

    您可以按照以下说明添加自定义绑定(bind):

  • https://www.youtube.com/watch?feature=player_detailpage&v=taBoOenbpiU&t=97s
  • http://slodge.blogspot.co.uk/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html
  • MvvmCross UITextField custom binding
  • 关于c# - MvvmCross Android EditText绑定(bind)未更新屏幕,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32122966/

    10-12 06:16