将微调器与从wcf Web服务检索的数据绑定

时间:2014-01-15 05:38:16

标签: wcf web-services xamarin.android xamarin xamarin-studio

我在我的Xamarin android应用程序中使用了一个简单的wcf Web服务。我有GetAllUser函数来从数据库中检索所有用户。

我可以使用我的Xamarin android应用程序插入用户。 但我对如何在我的Xamarin android中绑定从Web服务检索到的数据与spinner控件一无所知。 我在互联网上搜索了很多地方,但我仍无法用网络服务绑定我的微调器。

namespace WcfServiceSunday
{
    public class ServiceSunday : IServiceSunday
    {

        public  List<Employee> GetAllEmployee()
        {
            List<Employee> employee = new List<Employee>();
            string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
            SqlConnection con = new SqlConnection(constring);
            con.Open();
            string qry = "select * from EmpDetail";
            SqlCommand cmd = new SqlCommand(qry, con);

            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                Employee emp = new Employee();
                emp.EmpNo = dr.GetInt32(0);
                emp.Name = dr.GetString(1);
                emp.Empcode = dr.GetString(2);
                emp.keywords = dr.GetString(3);
                emp.mobile = dr.GetString(4);

                employee.Add(emp);

            }
            con.Close();
            return employee;

        }

以上是我的网络服务,用于从数据库中选择所有用户。 我想绑定微调器并在我的微调器控件中显示用户名。

以下是我的按钮点击事件以填充微调器。

 btn.Click += (sender, e) => {

                Employee emp = new Employee();
                GridView grdvw = FindViewById<GridView>(Resource.Id.grd);

                IList<Employee> employ = new List<Employee>();
                employ = sc.GetAllEmployee("");
                Spinner sp = FindViewById<Spinner>(Resource.Id.spinner);

                sp.Adapter = new ArrayAdapter(this,Android.Resource.Layout.SimpleSpinnerItem ,employ.ToList());

            };

我可以使用Web服务填充微调器,但是在spineer中显示数据 就像:

"WcfServiceSunday.Employee"

我将上面的内容作为微调器中的值下拉而不是用户的名称 在我的数据库中。

如何使用用户名填充微调器?

1 个答案:

答案 0 :(得分:1)

除非使用MvvmCross或QuickCross之类的东西进行数据绑定,否则无法绑定它。但是,与Android一样,您必须创建一个Adapter来填充View,例如ListViewSpinnerGridView。这很容易做到:

public class MySpinnerAdapter : ArrayAdapter<Employee>
{
    private readonly int _resource;
    private readonly int _resourceId;

    public MySpinnerAdapter(Context context, int resource, int textViewResourceId, IList<Employee> objects)
        : base(context, resource, textViewResourceId, objects)
    {
        _resource = resource;
        _resourceId = textViewResourceId;
    }

    public override View GetDropDownView(int position, View convertView, ViewGroup parent)
    {
        var inflater = LayoutInflater.FromContext(Context);
        var view = convertView ?? inflater.Inflate(_resource, parent, false);
        var textView = view.FindViewById<TextView>(_resourceId);
        textView.Text = GetItem(position).Name;
        return view;
    }
}

spinneritem.axml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinnerText"
    android:ellipsize="marquee"
    android:textAppearance="?android:attr/textAppearanceLarge"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:color="#ffffff" />

因此,使用上面的代码,您可以使用以下简单的代码片段填充您的Spinner:

var spinner = FindViewById<Spinner>(Resource.Id.spinner);
spinner.Adapter = new MySpinnerAdapter(this, Resource.Layout.spinneritem, Resource.Id.spinnerText, _serviceSunday.GetAllEmployee());
spinner.ItemSelected += (s, e) => 
{
    //Do something with the selected item
    //get the position with e.Position
}

鉴于_serviceSundayServiceSunday类的实例。

您当然可以根据自己的喜好自定义微调器项目,向其中添加更多信息等。只需记住在Adapter中反映这些更改。