3

我是 MVVMCross(一般是移动设备)的新手,我希望实现与错误消息的绑定(如 FluentValidation ValidationResults 或 IDataErrorInfo)。

最好,我想要一个可以直接绑定到的字典之类的错误: 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 添加错误时通知。

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

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

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

其他人使用 Xamarin/MVVMCross 使用哪些技术来提供验证反馈?

提前致谢。

4

1 回答 1

4

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

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

对于您的具体问题...


绑定到ObservableDictionary实现INotifyCollectionChanged并且INotifyPropertyChanged应该有效的方法。

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

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

我今天提交了一些修复 - 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']"
      />

感谢您指出此错误 - 修复的二进制文件将在接下来的一两天内完成!


在 int-string 问题上,绑定层目前“最好”(TM)将 UI 类型转换为 VM 类型。但是,当它失败时当前没有触发事件 - 因此无法从绑定中触发 ViewModel 中的任何验证规则。

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

于 2013-07-09T06:54:23.230 回答