每次键入键时,MvvmCross IMvxValueConverter 都会触发

MvvmCross IMvxValueConverter fires every time you type a key

我有一个 MvvmCross 应用程序,我正在使用日期值转换器,如下所示:

public class DateToStringConverter : IMvxValueConverter
{

    public object Convert(object value, Type targetType,
        object parameter, CultureInfo language)
    {
        if ((value != null) && (value.GetType() == typeof(DateTime)))
        {
            DateTime tmp = (DateTime)value;
            return tmp.ToString("MM/dd/yyyy");
        }
        return "";
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo language)
    {
        DateTime dt;
        if (DateTime.TryParse(value.ToString(), out dt))
            return dt;
        return null;
    }

}

我将它绑定到一个 EditText,如下所示:

                    <EditText
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:inputType="date"
                        android:id="@+id/txtinventorydate"
                        style="@style/InputEditText"
                        local:MvxBind="Text ShipmentInventory.InventoryDate, Mode=TwoWay, Converter=DateToStringConverter" />

当它从数据库加载值时,它看起来不错,但每次我键入一个字符时,它都会触发转换。它从不触发 ConvertBack。如果您正在输入日期,它似乎不想在您完成之前执行此操作,因为输入一半的日期不是有效日期。任何人都知道为什么它会以这种方式行事?有没有更好的方法将日期字段绑定到 EditText?当我省略转换器时,它会用整个日期和时间填充它,而我只想要日期。有人请帮助。

吉姆

要解决这个问题,您可以为 FocusText 添加一个绑定,它只会在失去焦点时更新。最近有关于在 MvvmCross 中引入 FocusText 的讨论 - 基于 MvvmCross: change update source trigger property of binding on MonoDroid - 但我不相信它曾经通过 Pull Request。

然而,实际上,在移动设备中 UI 通过自由文本输入日期通常是不受欢迎的 - 最好使用专门的日期控件 - 例如喜欢 https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/ApiExamples/ApiExamples.Droid/Resources/Layout/Test_Date.axml#L12