2016-05-10 4 views
2

Я работаю над проектом Xamarin, и мне нужно использовать сборщик, поэтому у нападающего сборщика Xamarin нет ItemsSource. Я нашел реализацию, которая работает почти нормально, здесь есть:Bindable Picker's Title не работает

using System; 
using System.Collections; 
using System.Linq; 
using Xamarin.Forms; 

namespace AnyNameSpace.Mobile.CustomControls 
{ 
    public class BindablePicker : Picker 
    { 
     public static readonly BindableProperty ItemsSourceProperty = 
      BindableProperty.Create( 
            "ItemSource", 
            typeof (IEnumerable), 
            typeof (BindablePicker), 
            default(IEnumerable), 
            BindingMode.TwoWay, 
            propertyChanged: OnItemsSourceChanged); 

     public static BindableProperty SelectedItemBindableProperty = 
       BindableProperty.Create(
            "SelectedItemBindable", 
            typeof (object), 
            typeof (BindablePicker), 
            default(object), 
            BindingMode.TwoWay, 
            propertyChanged: OnSelectedItemChanged); 

     public IEnumerable ItemsSource 
     { 
      get { return (IEnumerable) GetValue(ItemsSourceProperty); } 
      set { SetValue(ItemsSourceProperty, value); } 
     } 

     public object SelectedItemBindable 
     { 
      get { return GetValue(SelectedItemBindableProperty); } 
      set { SetValue(SelectedItemBindableProperty, value); } 
     } 

     public BindablePicker() 
     { 
      SelectedIndexChanged += OnSelectedIndexChanged; 
      base.Title = "Seleccione"; // Here I want a custom title, but this is ignoring me :(
     } 

     private static void OnItemsSourceChanged(BindableObject bindable, object oldvalue, object newvalue) 
     { 
      var picker = bindable as BindablePicker; 
      if (picker?.Items == null) return; 
      picker.Items.Clear(); 
      if (newvalue == null) return; 
      foreach (var item in ((IEnumerable)newvalue).Cast<object>().Where(item => item != null)) 
       picker.Items.Add(item.ToString()); 
     } 

     private void OnSelectedIndexChanged(object sender, EventArgs eventArgs) 
     { 
      if (Items != null && (SelectedIndex < 0 || SelectedIndex > Items.Count - 1)) 
       SelectedItemBindable = null; 
      else if (Items != null) SelectedItemBindable = Items[SelectedIndex]; 
     } 

     private static void OnSelectedItemChanged(BindableObject bindable, object oldvalue, object newvalue) 
     { 
      var picker = bindable as BindablePicker; 
      if (newvalue == null) return; 
      if (picker?.Items != null) picker.SelectedIndex = picker.Items.IndexOf(newvalue.ToString()); 
     } 
    } 
} 

Так что проблема: Когда установить свойство Title на XAML или даже в C# Это всегда говорит Раздел имущество «Выберите пункт» I «Я пытался установить заголовок Picker в конструкторе, но не работает.

Буду признателен за любую помощь, спасибо.

ответ

1

Установку титульных собственностей через Xaml или код работает отлично. Я только что проверил это в небольшом проекте.

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     xmlns:control="clr-namespace:AnyNameSpace.Mobile.CustomControls" 
     x:Class="TestApp.BindablePickerTestPage"> 

    <control:BindablePicker Title="MyTitle"></control:BindablePicker> 
</ContentPage> 
+0

большое спасибо, ребята, проблема в том, что фон моего приложения был белым !!! поэтому я никогда не вижу титула сборщика –

1

Может быть просто случай, когда значение будет перезаписываться где-то дальше по жизненному циклу элементов управления.

Возможно попытаться подписаться на OnAppearing событие и установить заголовок там

+0

спасибо большое, ребята, проблема в том, что: фон моего приложения был белым !!! поэтому я никогда не вижу титула сборщика –

Смежные вопросы