C#学习教程:将IDataErrorInfo用于嵌套对象我当前的实现包括嵌套对象和不同的ViewModel。例如,业务实体“Customer”包含业务实体“Address”。我在我的视图中直接访问地址,例如“Customer.Address”。要验证Address中的更改,我必须在Address中实现IDataErrorInfo。我在不同的视图/视图模型中使用客户或地址。在不同的视图/视图模型中使用将导致不同的验证行为。因此,仅在实体本身中实施验证是不够的。在ViewModel中公开我想直接更改的属性(创建直接设置/获取实体的新属性)似乎使ViewModel方式过于僵化。而且它太大了。我无法继承基类,因为一些业务实体已经从其他对象派生而来(事实上我无法更改)。我目前看到的唯一选择是向业务实体添加一个ViewModel接口,并将对业务实体中的this[]的调用转发到该ViewModel接口。是否有关于如何在ViewModel中验证这些嵌套对象的最佳实践?编辑:验证的另一个原因我不认为业务对象中的验证是一个有用的想法是我需要在我的ViewModel中使用不同的业务对象来验证视图和数据条目。我过去这样做的一种方法是在模型上公开一个ValidationDelegate,它允许ViewModel将自己的验证代码附加到模型。通常我这样做是因为我使用模型层作为普通数据对象,所以我的模型只验证基本的东西,比如最大长度或非空值,任何不特定于数据模型的高级验证都是在ViewModel中完成的。这通常包括确保项目是唯一的,或者用户有权将值设置为特定范围,甚至仅对某些操作存在验证。publicclassCustomerViewModel{//保持这些通用以减少此处的代码,但它//应该包括PropertyChange通知publicAddressModelAddress{get;放;}publicCustomerViewModel(){Address=newAddressModel();地址.AddValidationDelegate(ValidateAddress);}//ValidationDelegate来验证AdderessprivatestringValidateAddress(objectsender,stringpropertyName){//在这里进行特定于ViewModel的验证。//sender是您的AddressModel和propertyName//是要验证的地址的属性//例如:if(propertyName=="Street1"&&string.IsNullOrEmpty(Address.Street1))return"Street1cannotbeempty";返回空值;这是我经常使用的验证委托的代码:#regionIDataErrorInfo&ValidationMembers#regionValidationDelegatepublicdelegatestringValidationDelegate(objectsender,stringpropertyName);私有列表_validationDelegates=newList();publicvoidAddValidationDelegate(验证tionDelegatefunc){_validationDelegates.Add(func);}publicvoidRemoveValidationDelegate(ValidationDelegatefunc){if(_validationDelegates.Contains(func))_validationDelegates.Remove(func);}#endregion//验证委托#regionIDataErrorbindingInfoforIDataErrorInfo.Error{get{returnnull;}}stringIDataErrorInfo.this[stringpropertyName]{get{返回this.GetValidationError(propertyName);}}publicstringGetValidationError(stringpropertyName){strings=null;foreach(varfuncin_validationDelegates){s=func(this,propertyName);如果(s!=null)返回s;}返回s;}#endregion//用于绑定错误的IDataErrorInfo#endregion//IDataErrorInfo和验证成员在不同的视图/视图模型中使用将导致不同的验证行为,因此,你有不同的视图模型。如果您不能从某些基本视图模型继承这些视图模型,请使用聚合:publicclassAddress{}publicclassAddressViewModel1:IDataErrorInfo{privatereadonlyAddressaddress;//这里的其他内容}publicclassAddressViewModel2:IDataErrorInfo{privatereadonlyAddressaddress;//这里有其他内容}我如何使用依赖注入并将验证服务注入到每个不同视图模型的客户对象中?但我认为在您的视图模型中实现idataerrorinfo和所有需要的属性会更清晰,但当然还有一项工作。以上就是C#学习教程:IDataErrorInfowithnestedobjects的全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
