gpt4 book ai didi

android - MvvmCross - 将 EditText 设置为 void 不会更新 ViewModelProperty

转载 作者:搜寻专家 更新时间:2023-11-01 09:46:04 25 4
gpt4 key购买 nike

我在使用 Android editText 和 MvvmCross 时遇到问题。当我将 editText(包含一个数字)设置为无效(删除)时,它不会影响 ViewModel 属性。

它不依赖于我的代码,它可以在 MVVMCross 的 api 示例中重现:

AXML:

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter a number..." />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal|numberSigned"
android:textSize="30dp"
local:MvxBind="Text DoubleProperty" />

View 模型:

private double _doubleProperty = 42.12;

public double DoubleProperty
{
get { return _doubleProperty; }
set { _doubleProperty = value; RaisePropertyChanged(() => DoubleProperty); }
}

screenshot from API Example

最佳答案

问题在于 DoubleProperty 具有不可为 null 的 double 类型,因此它不能是“Void”值。简单地将 double 类型更改为可为空的 double 也不起作用。它将空字符串设置为可为空的 double 值会失败:

MvxBind:Error: 44.49 SetValue failed with exception - ArgumentException: Object of type 'System.String' cannot be converted to type 'System.Nullable`1[System.Double]'.

那么如何让它发挥作用呢?

方法 1 - 允许空值

我之前用过的一种方法是使用 MvxValueConverter 将空字符串转换为空值。

public class NullableDoubleToStringConverter : MvxValueConverter<double?, string>
{
protected override string Convert(double? value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString();
}

protected override double? ConvertBack(string value, Type targetType, object parameter, CultureInfo culture)
{
double outValue;
return double.TryParse(value, out outValue) ? (double?)outValue : null;
}
}

在您的 ViewModel 中将类型更改为可为空:

private double? _doubleProperty = 42.12;
public double? DoubleProperty
{
get { return _doubleProperty; }
set { _doubleProperty = value; RaisePropertyChanged(() => DoubleProperty); }
}

在您的 AXML/XML 中使用您的转换器:

<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal|numberSigned"
android:textSize="30dp"
local:MvxBind="Text NullableDoubleToString(DoubleProperty)" />

方法 2 - 默认为零(非空)

当删除 editText 中的最后一个当前值时,此方法会将值重置为 0。

转换器:

public class DoubleToStringConverter : MvxValueConverter<double, string>
{
protected override string Convert(double value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString();
}

protected override double ConvertBack(string value, Type targetType, object parameter, CultureInfo culture)
{
return string.IsNullOrWhiteSpace(value) ? default(double) : double.Parse(value);
}
}

View 模型属性:

private double _doubleProperty = 42.12;
public double DoubleProperty
{
get { return _doubleProperty; }
set { _doubleProperty = value; RaisePropertyChanged(() => DoubleProperty); }
}

布局AXML/XML:

<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal|numberSigned"
android:textSize="30dp"
local:MvxBind="Text DoubleToString(DoubleProperty)" />

关于android - MvvmCross - 将 EditText 设置为 void 不会更新 ViewModelProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com