Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android “获取Xamarin表单自定义渲染值”复选框_Android_Xamarin_Xamarin.android_Xamarin.forms_Xamarin Forms - Fatal编程技术网

Android “获取Xamarin表单自定义渲染值”复选框

Android “获取Xamarin表单自定义渲染值”复选框,android,xamarin,xamarin.android,xamarin.forms,xamarin-forms,Android,Xamarin,Xamarin.android,Xamarin.forms,Xamarin Forms,我有一个复选框,可以在Xamarin表单中正确渲染视图: public class CheckBoxRenderer : ViewRenderer<LegalCheckbox, CheckBox> { protected override void OnElementChanged(ElementChangedEventArgs<LegalCheckbox> e) { base.OnElementChanged (e);

我有一个复选框,可以在Xamarin表单中正确渲染视图:

public class CheckBoxRenderer : ViewRenderer<LegalCheckbox, CheckBox>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<LegalCheckbox> e)
    {
        base.OnElementChanged (e);
        CheckBox control = new Android.Widget.CheckBox(this.Context);
        control.Checked = false;
        control.Text = "I agree to terms";
        control.SetTextColor (Android.Graphics.Color.Rgb (60, 60, 60));
        this.SetNativeControl(control);
    }
}
public类CheckBoxRenderer:ViewRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
碱基。一个元素改变(e);
CheckBox control=newandroid.Widget.CheckBox(this.Context);
control.Checked=false;
control.Text=“我同意条款”;
control.SetTextColor(Android.Graphics.Color.Rgb(60,60,60));
此项。设置NativeControl(控制);
}
}

我想检查是否选中了此复选框。我有办法做到这一点吗?我需要使用依赖性服务吗?

不要认为依赖性服务在这里会有所帮助,它只是一个IOC容器。面对同样的问题,我可能会安排一些活动

public class CheckBoxRenderer : ViewRenderer<LegalCheckbox, CheckBox>
{
    private LegalCheckbox legalCheckBox;
    protected override void OnElementChanged (ElementChangedEventArgs<LegalCheckbox> e)
    {
        base.OnElementChanged (e);
        legalCheckBox = e.NewElement;
        CheckBox control = new Android.Widget.CheckBox(this.Context);
        control.Checked = false;
        control.Text = "I agree to terms";
        control.SetTextColor (Android.Graphics.Color.Rgb (60, 60, 60));
        base.SetNativeControl(control);
        Control.Click+=(sender,evt)=> 
            legalCheckBox.Checked = ((CheckBox)sender).Checked;
    }
}
为什么?? 我倾向于将平台控件和Xamarin控件之间的关系视为模型视图适配器模式。平台控件是您的视图。您的Xamarin控件是您的模型,渲染器在这两者之间进行调整。 为了实现这一点,我们需要在LegalCheckbox(Model)中的某个地方存储我们想要收集的数据。然后我们必须将其连接起来,以便对视图的更改导致对模型的更改。因此,我们在视图中为OnClick事件添加EventHandler来更新我们的模型


在最初的glace中,所有这些都可能发生在OnelementChanged事件中。然而,它只是在那个时候才真正连接起来,直到OneElementChanged完成并且其资源被销毁之后很长一段时间,实际检查的事件才会触发。因此,我们需要一个对OnElementChanged事件处理程序的LegalCheckbox外部的引用,当单击的事件触发时,该事件处理程序仍将在那里。

代码正在抛出
System.NullReferenceException:对象引用未设置为单击事件内对象的实例。有什么想法吗?哦,很抱歉。我猜这就是我没有测试代码的原因:D您需要将CheckBox控件定义为类级字段,然后在OnElementChanged的主体中分配它。问题是当OneElementChanged完成时,对“control”的引用被破坏。稍后,您分配给控件的“代理”。时钟尝试使用它,但找不到它。我更新了GitHub示例。请参阅:编辑已修复它。:)非常感谢你。您如何知道需要有一个类级字段,并且需要在OnElementChanged内部分配该字段,以及CustomRenderer需要具有其呈现的类类型的属性才能访问其属性?更新了答案,并提供了一些有关原因的信息。
public class LegalCheckbox : View
{
    public bool Checked { 
        get; 
        set; 
    }
    public LegalCheckbox ()
    {
    }
}