xamarin.ios - 使用 MVVMCross 绑定(bind)错误信息

标签 xamarin.ios mvvmcross

我是 MVVMCross(通常是移动设备)的新手,我希望实现对错误消息的绑定(bind)(例如 FluentValidation ValidationResults 或 IDataErrorInfo)。

最好,我想要一个像字典这样的错误,我可以直接绑定(bind)到: bind(label).To(vm => vm.Errors["Name"])

我尝试了 ObservableDictionary ( http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c.aspx ),但是当 ViewModel 添加错误时我没有收到通知。

正如预期的那样,将访问作为属性包装在 View 模型中是可行的,但可能会变得很麻烦: public string NameError { get { return Errors.ContainsKey("Name") ?错误[“名称”]:空; }

我也考虑过创建自定义绑定(bind),但不确定如何访问 ViewModel 并传递我想要的字段名称。似乎我可以传递错误或属性名称。

最后,由于无效转换(即 int 的 22ab)没有被推送到 View 模型中,有没有办法得到这些错误?我应该在数据被推回 View 模型之前进行验证吗?像 iOS 上的 textFieldShouldEndEditing 或 ShouldChangeCharacters?如有必要,我可以包装一个自定义控件。

其他人将哪些技术与 Xamarin/MVVMCross 一起用于提供验证反馈?

提前致谢。

最佳答案

MvvmCross 目前没有实现 IDataErrorInfo 级别的数据绑定(bind)

这主要是因为还没有人要求它 - 但我想这可能会随着这个问题而改变。如果您确实有特定要求,那么该项目将有兴趣听取他们的意见 - 怀疑最好的地方是该项目的 github 问题。

针对您的具体问题...


绑定(bind)到实现 INotifyCollectionChangedINotifyPropertyChangedObservableDictionary 的方法应该可行。

但是,查看您链接中的代码,我认为字典没有正确实现 INotifyPropertyChanged - 除了 INotifyCollectionChanged 事件之外,它还应该在 CountItem[] 上引发属性更改通知 - 没有这些,绑定(bind)到整个集合将起作用,但不适用于单个项目和计数。有关 ObservableCollection 的示例源,请参阅 https://github.com/mosa/Mono-Class-Libraries/blob/master/mcs/class/System/System.Collections.ObjectModel/ObservableCollection.cs

再次查看您链接中的代码,似乎字典正确地实现了 INotifyPropertyChanged - 它引发了属性更改通知 Item[] - 并且这是绑定(bind)各个项目所需的字符串。您是否启用了调试跟踪?跟踪是否为您提供了失败原因的任何线索?

我今天提交了一些修复 - https://github.com/slodge/MvvmCross/issues/345 - 并在此示例中测试了它们 - Test_WithErrors.axml - 我希望同样的示例可以在 iOS 上运行(iOS 测试应用程序正在进行中)并且它也应该可以扩展 Jeremy 出色的 FluentValidation(尽管我还没有以 PCL 形式使用它)

  <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Enter email:"
      />
  <EditText
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="30dp"
    local:MvxBind="Text Email"
    />
  <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="#ff0000"
    local:MvxBind="Text Errors['Email']"
      />

感谢您指出这个错误 - 修复后的二进制文件将在接下来的一两天内成为 nuget!


关于 int-string 问题,绑定(bind)层目前“尽其所能”(TM) 将 UI 类型转换为 VM 类型。但是,当前没有事件在失败时触发 - 因此无法通过绑定(bind)触发 ViewModel 中的任何验证规则。

相反,在允许自由文本输入的情况下,我认为您需要将 ViewModel 类型实现为 string,然后需要在 ViewModel 属性更改时触发验证规则。因为 MvvmCross 不会在验证发生时公开任何绑定(bind)级别 Hook ,所以您可能需要在绑定(bind)发生时进行调整(例如,在第一响应者辞职时)而不是进行持续验证 - 但这应该是相当直接的使用自定义 -绑定(bind)。

关于xamarin.ios - 使用 MVVMCross 绑定(bind)错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17534463/

相关文章:

mvvmcross - ViewModel LifeCycle,它什么时候被处理掉?

c# - 当我单击 GridView 项时返回 ImageView 实例

c# - 如何覆盖 Xamarin.IOS UIButton 的 LayoutSublayersOfLayer 行为?

ios - 增强现实套件 3 : SupportsFrameSemantics() is returning false on supported iOS device

objective-c - UITableView : Hide cells animated?

android - 需要帮助阅读 Android Stacktrace for Mvvmcross fragment crash

c# - MvvmCross - 使用 Activity (上下文)参数实例化 ViewModel

xamarin - iPhone 启动图像中没有横向选项

c# - 使用两个相似的 Collection View 单元格,从而避免代码重复

c# - 绑定(bind)到 MvvmCross for MonoDroid/Android 中的 Path ImageView