我是 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)到实现 INotifyCollectionChanged
和 INotifyPropertyChanged
的 ObservableDictionary
的方法应该可行。
但是,查看您链接中的代码,我认为字典没有正确实现 INotifyPropertyChanged
- 除了 INotifyCollectionChanged
事件之外,它还应该在 Count
和 Item[]
上引发属性更改通知 - 没有这些,绑定(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/