MvvmCross Bindable MonoTouch.Dialog RadioElement

时间:2014-05-16 13:09:09

标签: c# xamarin.ios mvvmcross monotouch.dialog

我正在尝试创建一个可绑定的RadioElement,用于MvvmCross中的MonoTouch.Dialog实现,并遵循https://github.com/MvvmCross/MvvmCross-Tutorials/tree/master/DialogExamples/DialogExamples.Touch/BindableElements中的模式(如MvvmCross Monotouch.Dialog binding data to a table中所述),我创建了以下类:< / p>

public class MvxBindableRadioElement : RadioElement, IBindableElement
{
    public IMvxBindingContext BindingContext { get; set; }

    public MvxBindableRadioElement ()
    {
        this.CreateBindingContext();

        this.DelayBind(() => {
            var set = this.CreateBindingSet<MvxBindableRadioElement, PropertyCategory>();
            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<MvxBindableRadioElement> ().Bind(bindings, e => e.ItemsSource, vm => vm.PropertyCategories)
    }.Bind (bindings, e => e.RadioSelected, vm => vm.PropertyCategory) as Element
}

其中BindableSection取自上述MvvmCross回购。

调试我能够验证newElements的{​​{1}}变量是否正确填充了MvxBindableSection,但执行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 <filename unknown>:0 at Cirrious.MvvmCross.Binding.Bindings.Target.MvxConvertingTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0 at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (System.Object value) [0x00000] in <filename unknown>:0 InnerException was NullReferenceException: Object reference not set to an instance of an object at <redacted>.iOS.Views.MvxBindableSection`1[<redacted>.Views.MvxBindableRadioElement].NotifyDataSetChanged () [0x000b9] in <redacted>/MonoTouch.Dialog/MvxBindableSection.cs:87 at <redacted>.iOS.Views.MvxBindableSection`1[<redacted>.Views.MvxBindableRadioElement].SetItemsSource (IEnumerable value) [0x00094] in <redacted>/MonoTouch.Dialog/MvxBindableSection.cs:56 at <redacted>.iOS.Views.MvxBindableSection`1[<redacted>.Views.MvxBindableRadioElement].set_ItemsSource (IEnumerable value) [0x00003] in <redacted>/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回购中的MvxBindableRadioElement

CustomStringElement

这就像一个魅力。为什么new MvxBindableSection<CustomStringElement>().Bind(bindings, element => element.ItemsSource, vm => vm.PropertyCategories) 有效,而CustomStringElement无效?我是否必须创建一个包装MvxBindableRadioElement的可绑定RadioGroup

编辑:

这是内部异常(NullReferenceException):

MvxBindableRadioElement

1 个答案:

答案 0 :(得分:2)

好的,问题在于BindableSection的实施(取自MvvmCross-Tutorials / DialogExamples): 除非您使用Section添加元素,否则Parent元素的null未设置(即AddAll())。这个问题实际上发生在MT.Dialog本身的内容中。

更新的MvxBindableSection可用here