0

Xamarin Forms で適切にレンダリングされるチェックボックス ビューがあります。

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);
    }
}

このチェックボックスがチェックされているかどうかを確認したい。これを行う方法はありますか?依存関係サービスを使用する必要がありますか?

4

1 に答える 1

0

Dependency Services がここで役立つとは思わないでください。単なる 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;
    }
}

同様に、ビューに小道具を追加します

public class LegalCheckbox : View
{
    public bool Checked { 
        get; 
        set; 
    }
    public LegalCheckbox ()
    {
    }
}

なんで?私は、プラットフォーム コントロールと Xamarin コントロールの関係をモデル - ビュー - アダプター パターンと考える傾向があります。プラットフォーム コントロールはビューです。Xamarin コントロールはモデルであり、レンダラーはモデル間の適応を行います。これを達成するには、LegalCheckbox(Model) のどこかに、収集したいデータを保存する必要があります。次に、ビューを変更するとモデルが変更されるように接続する必要があります。したがって、View の OnClick イベントの EventHandler を追加して、モデルを更新します。

一見すると、これらすべてが OnelementChanged イベント中に発生するように見えるかもしれません。ただし、その時点で実際に配線されているのは、OnElementChanged が完了してそのリソースが破棄されるまで、実際の Checked Event が発生しないだけです。したがって、OnElementChanged イベント ハンドラーの外側にある LegalCheckbox への参照が必要です。これは、Clicked イベントが発生したときにも存在します。

于 2015-10-19T19:00:45.840 に答える