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 不会在验证发生时公开任何绑定级别挂钩,所以您可能需要在绑定发生时进行调整(例如,在第一响应者辞职时)而不是进行持续验证 - 但这应该使用自定义 -捆绑。