C# 如何在自定义选择器中设置和获取选定值?该值不可更改

C# 如何在自定义选择器中设置和获取选定值?该值不可更改,c#,xamarin,custom-renderer,C#,Xamarin,Custom Renderer,如何获取自定义选取器的选定项?它总是返回到初始状态“Sonstige”(=“Other”)。因此,该值是不可变的 我已经面对这个问题好几个小时了,但对于如何解决它却没有进一步的想法。我不熟悉自定义渲染 我想使用DoneBtn\u Clicked功能设置选择器的新值: void DoneBtn_单击(对象发送方,事件参数e){} 自定义选取器的屏幕截图: 我的代码: 类PickerRendererIos.cs: [程序集:ExportRenderer(typeof(MyPickerRend

如何获取自定义选取器的选定项?它总是返回到初始状态“Sonstige”(=“Other”)。因此,该值是不可变的

我已经面对这个问题好几个小时了,但对于如何解决它却没有进一步的想法。我不熟悉自定义渲染

我想使用
DoneBtn\u Clicked
功能设置选择器的新值:

void DoneBtn_单击(对象发送方,事件参数e){}

自定义选取器的屏幕截图:


我的代码: 类PickerRendererIos.cs:

[程序集:ExportRenderer(typeof(MyPickerRenderer)、typeof(PickerRendererIos))]
命名空间DigitalNatives.iOS
{
公共类PickerRendererIos:PickerRenderer,IUIPickerViewDelegate
{
IElementController元素控制器=>元素作为IElementController;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
UIPickerView pickerView=(UIPickerView)Control.InputView;
pickerView.WeakDelegate=this;
pickerView.BackgroundColor=UIColor.White;//设置pickerView的背景色
}
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
Control.Layer.BorderWidth=1;
Control.BorderStyle=UITextBorderStyle.Line;
Control.TextColor=UIColor.Blue;
}
[导出(“pickerView:viewForRow:forComponent:reusingView:”)]
公共UIView GetView(UIPickerView-pickerView、nint行、nint组件、UIView视图)
{
UILabel label=新UILabel
{
TextColor=UIColor.Blue,
Text=Element.Items[(int)行].ToString(),
TextAlignment=UITextAlignment.Center,
};
var picker=this.Element;
退货标签;
}
}
}

原因:

因为您设置了pickerview的
委托
,pickerview.WeakDelegate=this。但您没有在委托中实现所有方法

解决方案:

您可以覆盖按钮的单击操作
Done
。请参阅以下代码

在自定义渲染器中

[程序集:ExportRenderer(typeof(MyPicker)、typeof(MyPickerRenderer))]
命名空间xxx.iOS
{
公共类MyPickerRenderer:PickerRenderer、IUIPickerViewDelegate、IUIPickerViewDataSource
{
字符串SelectedValue;
公共采蜜树
{
}
公共nint GetComponentCount(UIPickerView pickerView)
{
返回1;
}
公共nint GetRowsInComponent(UIPickerView pickerView,nint组件)
{
返回元素.Items.Count;
}
[导出(“pickerView:viewForRow:forComponent:reusingView:”)]
公共UIView GetView(UIPickerView-pickerView、nint行、nint组件、UIView视图)
{
UILabel label=新UILabel
{
TextColor=UIColor.Blue,
Text=Element.Items[(int)行].ToString(),
TextAlignment=UITextAlignment.Center,
};
var picker=this.Element;
退货标签;
}
[导出(“pickerView:didSelectRow:Incomonent:”)]
已选择公共无效(UIPickerView pickerView、第九行、第九组件)
{
Control.Text=Element.Items[(int)行];
SelectedValue=Element.Items[(int)行];
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
SelectedValue=Element.Items[0];
UIPickerView pickerView=(UIPickerView)Control.InputView;
pickerView.WeakDelegate=this;
pickerView.DataSource=this;
//完成按钮并重写事件
UIToolbar工具栏=(UIToolbar)Control.InputAccessoryView;
UIBarButtonim done=新建UIBarButtonim(“完成”,uiBarButtonimStyle.done,(对象发送者,事件参数单击)=>
{
Control.Text=SelectedValue;
toolbar.RemoveFromSuperview();
pickerView.RemoveFromSuperview();
Control.ResignFirstResponder();
});
UIBarButtonItem empty=新UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace,null);
toolbar.Items=newuibarbuttonItem[]{empty,done};
}
}
}
}

嘿,你解决了这个问题吗?很好的解决方案,但当我尝试它时,我遇到了以下问题:-所选项目索引不更新/selecteditem文本返回项目0文本-Picker.SelectedIndexChanged事件在更改值时不激活(可能与第一个问题有关)
[assembly: ExportRenderer(typeof(MyPicker), typeof(MyPickerRenderer))]
namespace xxx.iOS
{
   public class MyPickerRenderer:PickerRenderer,IUIPickerViewDelegate,IUIPickerViewDataSource
   {

    string SelectedValue;

    public MyPickerRenderer()
    {
    }

    public nint GetComponentCount(UIPickerView pickerView)
    {
        return 1;
    }

    public nint GetRowsInComponent(UIPickerView pickerView, nint component)
    {
        return Element.Items.Count;
    }

    [Export("pickerView:viewForRow:forComponent:reusingView:")]
    public UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view)
    {

        UILabel label = new UILabel
        {
            TextColor = UIColor.Blue,
            Text = Element.Items[(int)row].ToString(),
            TextAlignment = UITextAlignment.Center,
        };
        var picker = this.Element;
        return label;
    }

    [Export("pickerView:didSelectRow:inComponent:")]
    public void Selected(UIPickerView pickerView, nint row, nint component)
    {
        Control.Text = Element.Items[(int)row];
        SelectedValue= Element.Items[(int)row]; 
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {
        base.OnElementChanged(e);

        if(Control!=null)
        {
            SelectedValue = Element.Items[0];

            UIPickerView pickerView = (UIPickerView)Control.InputView;
            pickerView.WeakDelegate = this;
            pickerView.DataSource = this;

            // get the button Done and rewrite the event
            UIToolbar toolbar = (UIToolbar)Control.InputAccessoryView;

            UIBarButtonItem done = new UIBarButtonItem("Done", UIBarButtonItemStyle.Done, (object sender, EventArgs click) =>
                {
                    Control.Text = SelectedValue;
                    toolbar.RemoveFromSuperview();
                    pickerView.RemoveFromSuperview();
                    Control.ResignFirstResponder();
                });

            UIBarButtonItem empty = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace, null);

            toolbar.Items = new UIBarButtonItem[] { empty,done };
        }

    }

  }
}