【问题标题】:Why is the ConvertBack method of an MvvmCross Value Converter not being called?为什么没有调用 MvvmCross 值转换器的 ConvertBack 方法?
【发布时间】:2014-02-10 13:50:01
【问题描述】:

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

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();

注意:我在 set.Bind 中添加了 .TwoWay() 绑定修饰符,认为模式可能必须明确说明,无需更改。

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

但是,当视图关闭时,并没有调用对应的 ConvertBack 方法。

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

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方法(元素为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);
}

看起来没有任何干扰。

如果您需要更多信息,请告诉我。提前致谢。

【问题讨论】:

  • 您能否编辑问题以添加 BooleanValue 在视图上的内容,以及在绑定更改时通知绑定的内容。例如,它是一个复选框吗?
  • @Stuart - 在内联上方添加了额外的 BooleanValue 信息。如果我需要详细说明或发布更多代码,请告诉我。

标签: xamarin.ios mvvmcross


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 2011-09-24
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2012-08-19
    • 2013-12-18
    • 2019-01-23
    相关资源
    最近更新 更多