为什么没有调用MvvmCross值转换器的ConvertBack方法?

时间:2014-02-10 13:50:01

标签: xamarin.ios mvvmcross

首次使用MvvmCross Value Convertors。我创建了一个值转换器来处理bool之间的数据操作?我视图中的元素和视图模型中的bool属性。

public sealed class NullableBooleanValueConverter : MvxValueConverter<bool, bool?>
{
    // ViewModel -> View
    protected override bool? Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (bool?)value;
    }

    // View -> ViewModel
    protected override bool ConvertBack(bool? value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value ?? false;
    }
}

我在视图的ViewDidLoad中将视图元素绑定到视图模型。

var set = this.CreateBindingSet<SettingsView, SettingsViewModel>();
set.Bind(wifiOnlyElement).For(View => View.BooleanValue).To(ViewModel => ViewModel.ConnectOnWifiOnly).WithConversion("NullableBoolean").TwoWay();
set.Apply();

注意:我将.TwoWay()绑定修饰符添加到set.Bind,认为可能必须明确声明模式,而不做任何更改。

当视图出现时,将调用NullableBooleanValueConverter的Convert方法。

但是,当视图关闭时,不会调用相应的ConvertBack方法。

基于this question我怀疑我没有绑定到正确的属性。我正在创建绑定的屏幕控件是来自Xamarin的Dialog / Element类的自定义UITableViewCell,此屏幕控件上的可为空的BooleanValue是公共的,并且在点击元素时存储了true / false值。

BooleanValue是一个名为CheckboxElement的Dialog / Element类的公共属性,它继承自基本Element类。

NSObject
    |_ Element
        |_ CheckboxElement
            .BooleanValue

CheckboxElement中有一个名为Selected的重写属性,可以在点击元素时更改BooleanValue的值。

public override void Selected(DialogViewController dvc, UITableView tableView, NSIndexPath indexPath)
{
    BooleanValue = !BooleanValue;
    ...
}

Selected由DialogViewController的RowSelected方法调用。

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
    Container.Selected(indexPath);
}

调用DialogViewController的Selected方法(element是CheckboxElement)。

public virtual void Selected(NSIndexPath indexPath)
{
    var section = Root.Sections[indexPath.Section];
    var element = section.Elements[indexPath.Row];

    ActiveElement = element;

    element.Selected(this, Root.TableView, indexPath);
}

看起来没有任何干扰的东西。

如果您需要更多信息,请与我们联系。提前谢谢。

1 个答案:

答案 0 :(得分:1)

Mvvmcross依靠事件通知在值发生变化时告诉它。

当事件通知不可用时,您可以编写自定义绑定以帮助MvvmCross知道ui何时更新。有关详细信息,请参阅n = 28 - http://mvvmcross.blogspot.com

中的自定义绑定

对于Monotouch.Dialog的特定情况,Mvvmcross提供了自己的分支,其中包括布尔元素的双向绑定,例如基于UiSwitch的Elements。您可能会发现使用此mvvmcross分支更容易 - 有关此内容的更多信息,请在n + 1个视频中查找对话框。