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

标签 c# xamarin custom-renderer

如何获取自定义选择器的选定项目?它总是返回到初始状态“Sonstige”(=“其他”)。所以该值是不可更改的。

我面对这个问题已经好几个小时了,但不知道如何解决它。我是自定义渲染新手。

我想使用 DoneBtn_Clicked 函数为选择器设置新值:

void DoneBtn_Clicked(object sender, EventArgs e){}

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

screenshot


我的代码: 类 PickerRendererIos.cs :

[assembly: ExportRenderer(typeof(MyPickerRenderer), typeof(PickerRendererIos))]

namespace DigitalNatives.iOS
{

    public class PickerRendererIos : PickerRenderer, IUIPickerViewDelegate
    {
        IElementController ElementController => Element as IElementController;

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

            if (Control != null)
            {
                UIPickerView pickerView = (UIPickerView)Control.InputView;
                pickerView.WeakDelegate = this;
                pickerView.BackgroundColor = UIColor.White; //set the background color of pickerview

            }

        }


        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            Control.Layer.BorderWidth = 1;
            Control.BorderStyle = UITextBorderStyle.Line;
            Control.TextColor = UIColor.Blue;
        }

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

    }
}

最佳答案

原因:

因为你设置了pickerview的delegatepickerView.WeakDelegate = this;。但是你并没有实现delegate中的所有方法。

解决方案:

您可以覆盖按钮的点击操作完成。请引用以下代码

in the Custom Renderer

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

    }

  }
}

关于c# - 如何在自定义选择器中设置和获取选定值?该值不可更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54054030/

相关文章:

c# - 查看用户是否属于 C# + Asp.net 中的 Active Directory 组

c# - 仅针对一个请求在现有 HttpClient 中将 AllowAutoRedirect 设置为 false

javascript - 如何解决 Vue 3 自定义渲染器错误

c# - Xamarin Forms - 在按钮中加载图像

xamarin - 我可以在 Xamarin.Forms 中使页面内容淡入淡出吗?

java - CellRenderer - 使文本变粗

C# - dbf 外部表不是预期的格式

c# - 如何在 asp.net 中设置控件属性

xamarin - 在手机 xamarin 表单上播放标准/系统声音

c# - 在 Xamarin Forms 中滚动时如何折叠(隐藏或向上滑动)导航栏(标题栏)?