MvvmCross Bindable MonoTouch.Dialog RadioElement
我正在尝试创建一个可绑定的RadioElement,用于MvvmCross中的MonoTouch.Dialog实现,并遵循https://github.com/MvvmCross/MvvmCross-Tutorials/tree/master/DialogExamples/DialogExamples.Touch/BindableElements中的模式(正如在MvvmCross Monotouch.Dialog中将数据绑定到表中所建议的那样 ,我创建了以下类:
public class MvxBindableRadioElement : RadioElement, IBindableElement { public IMvxBindingContext BindingContext { get; set; } public MvxBindableRadioElement () { this.CreateBindingContext(); this.DelayBind(() => { var set = this.CreateBindingSet(); set.Bind().For(me => me.Caption).To(p => p.Id); set.Bind().For(me => me.Value).To(p => p.Value); set.Apply(); }); } protected override void Dispose(bool disposing) { if (disposing) { BindingContext.ClearAllBindings(); } base.Dispose(disposing); } public virtual object DataContext { get { return BindingContext.DataContext; } set { BindingContext.DataContext = value; } } }
PropertyCategory
是一个基本模型:
public class PropertyCategory { public int Id { get; set; } public string Value { get; set; } }
用法如下:
new Section { new RootElement ("Category", new RadioGroup ()) { new BindableSection ().Bind(bindings, e => e.ItemsSource, vm => vm.PropertyCategories) }.Bind (bindings, e => e.RadioSelected, vm => vm.PropertyCategory) as Element }
其中BindableSection
取自上面提到的MvvmCross回购。
调试我能够validationnewElements
变量是否正确填充了MvxBindableRadioElement
,但是当执行TableView.ReloadData()
行时会发生以下错误:
MvxBind:Error: 12.12 Problem seen during binding execution for binding ItemsSource for PropertyCategories - problem TargetInvocationException: Exception has been thrown by the target of an invocation. at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0005c] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:238 at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MethodBase.cs:114 at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValueImpl (System.Object target, System.Object value) [0x00000] in :0 at Cirrious.MvvmCross.Binding.Bindings.Target.MvxConvertingTargetBinding.SetValue (System.Object value) [0x00000] in :0 at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (System.Object value) [0x00000] in :0 InnerException was NullReferenceException: Object reference not set to an instance of an object at .iOS.Views.MvxBindableSection`1[.Views.MvxBindableRadioElement].NotifyDataSetChanged () [0x000b9] in /MonoTouch.Dialog/MvxBindableSection.cs:87 at .iOS.Views.MvxBindableSection`1[.Views.MvxBindableRadioElement].SetItemsSource (IEnumerable value) [0x00094] in /MonoTouch.Dialog/MvxBindableSection.cs:56 at .iOS.Views.MvxBindableSection`1[.Views.MvxBindableRadioElement].set_ItemsSource (IEnumerable value) [0x00003] in /MonoTouch.Dialog/MvxBindableSection.cs:30 at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00044] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:230
解决这个问题,我用上面提到的MvvmCross repo中的CustomStringElement
替换了MvxBindableRadioElement
:
new MvxBindableSection().Bind(bindings, element => element.ItemsSource, vm => vm.PropertyCategories)
这就像一个魅力。 为什么CustomStringElement
工作,而不是MvxBindableRadioElement
? 我是否必须创建一个包装MvxBindableRadioElement
的可绑定RadioGroup
?
编辑:
这是内部exception(NullReferenceException):
at CrossUI.Touch.Dialog.Elements.RadioElement.SubscribeToRoot () [0x00000] in :0 at CrossUI.Touch.Dialog.Elements.RadioElement.GetCellImpl (MonoTouch.UIKit.UITableView tv) [0x00000] in :0 at CrossUI.Touch.Dialog.Elements.Element.GetCell (MonoTouch.UIKit.UITableView tv) [0x00000] in :0 at CrossUI.Touch.Dialog.DialogViewController+Source.GetCell (MonoTouch.UIKit.UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) [0x00000] in :0 at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38 at PGPCapture.iOS.Application.Main (System.String[] args) [0x00008] in /Main.cs:21
好的,所以问题在于BindableSection
的实现(取自MvvmCross-Tutorials / DialogExamples ):除非使用AddAll()
添加元素,否则不会设置Section
元素的Parent
(即为null
AddAll()
。 这个问题实际上发生在MT.Dialog本身的内容中。
更新的MvxBindableSection
可在此处获得 。
上述就是C#学习教程:MvvmCross Bindable MonoTouch.Dialog RadioElement分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949869.html