2016-06-24 2 views
0

У меня проблема с ListView. Я хочу, чтобы каждая ячейка имела метку и переключатель, но текст метки не отображается.Изменение метки Xamarin в ListCell не работает

Вот мой код:

public class FilterPage : ContentPage 
{ 
    public FilterPage() 
    { 
     List<FilterCell> listContent = new List<FilterCell>(); 
     foreach(string type in Database.RestaurantTypes) 
     { 
      FilterCell fc = new FilterCell(); 
      fc.Text = type; 

      listContent.Add(fc); 
     } 
     ListView types = new ListView(); 
     types.ItemTemplate = new DataTemplate(typeof(FilterCell)); 
     types.ItemsSource = listContent; 

     var layout = new StackLayout(); 
     layout.Children.Add(types); 

     Content = layout; 
    } 
} 

public class FilterCell : ViewCell 
{ 
    private Label label; 
    public Switch CellSwitch { get; private set; } 
    public String Text{ get { return label.Text; } set { label.Text = value; } } 


    public FilterCell() 
    { 
     label = new Label(); 
     CellSwitch = new Switch(); 

     var layout = new StackLayout 
     { 
      Padding = new Thickness(20, 0, 0, 0), 
      Orientation = StackOrientation.Horizontal, 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
      Children = { label, CellSwitch } 
     }; 
     View = layout; 
    } 
} 

Если я вхожу фиксированный текст в FilterCell-Конструктора он отлично работает (например: label.Text = "Hello World")

Когда я создаю Метод для ItemSelected-Event и зачитать свойство SelectedItem.Text. Я получаю текст, назначенный как Value, но он никогда не отображается. Когда я пытаюсь запустить этот код, отображается только переключатель.

Спасибо за вашу помощь Niko

+0

@Jason код, который я разместил, не работает для меня.Это не приводит к ошибке, но я не вижу текст ярлыка Просто замените базу данных.RestaurantTypes с любым списком строк – greece57

+0

Я просто присвоил метке текст «Просто тест» в конструкторе, и это то, что отображается в приложение Но когда я проверяю label.Text в режиме отладки, это не то, что отображается :( Есть ли возможность обновить макет? Я не нашла его:/ – greece57

ответ

3

Оу мальчик. Этот код выглядит как изнасилование (извините, я должен был сказать это).

Теперь давайте посмотрим, что это не так:

Причина в том, вы смешивания данных и вид сильно.

Линия

types.ItemTemplate = new DataTemplate(typeof(FilterCell)); 

означает: "Для каждого элемента в списке (ItemsSource) создать новую ячейку фильтра". FilterCell s, которые вы создаете в цикле, никогда не отображаются.

Простое исправление

public class FilterPage : ContentPage 
{ 
    public FilterPage() 
    { 
     var restaurantTypes = new[] {"Pizza", "China", "German"}; // Database.RestaurantTypes 
     ListView types = new ListView(); 
     types.ItemTemplate = new DataTemplate(() => 
     { 
      var cell = new SwitchCell(); 
      cell.SetBinding(SwitchCell.TextProperty, "."); 
      return cell; 
     }); 
     types.ItemsSource = restaurantTypes; 
     Content = types; 

    } 
} 
  • Существует стандартный тип клеток, который содержит метку и переключатель SwitchCell, используйте его.
  • Как ItemsSource вашего списка, вы должны использовать данные . В вашем случае список типов ресторанов. Я просто издевался над ними со статическим списком.
  • DataTemplate создает SwitchCell и устанавливает свойство Databinding для текста. Это волшебный клей между представлением и данными. «.» привязывает его к самому элементу данных. Мы используем его, потому что наш список содержит элементы строк, а текст должен быть точно строкой. (читайте о привязке данных: https://developer.xamarin.com/guides/xamarin-forms/getting-started/introduction-to-xamarin-forms/#Data_Binding)
  • Я отстранил StackLayout, который содержал список. Вы можете напрямую установить список как Content страницы.

Урок

  • использовать стандартные элементы управления, если это возможно
  • Вы всегда должны стараться, чтобы помнить, чтобы сохранить данные и просматривать отдельно друг от друга и использовать привязку данных для соединения друг с другом.
  • Старайтесь избегать ненужных видов.
+0

Спасибо за отзыв о моем коде - глядя теперь над ним, это похоже на изнасилование. Тем временем я узнал о SwitchCell сам, но я не мог связать его с данными, поэтому ваше решение очень полезно, спасибо! У меня есть ** наблюдение вопрос **: Потому что мне нужны результаты, которые я думал о креатине g структура, содержащая «имя строки» и «bool Enabled». Нет У меня возникли проблемы с привязкой этих свойств к SwitchCell. В качестве ItemSource я передал список этих структур. – greece57

+0

'cell.SetBinding (SwitchCell.TextProperty,« Name »)' и 'cell.SetBinding (SwitchCell.IsEnabledProperty,« Enabled »);' –

+0

Привет, у меня был и есть этот код, но он не работает. Я не могу найти то, что я делаю неправильно: Я задам новый вопрос: [здесь] (http://stackoverflow.com/questions/38030732/cant-set-binding-of-switchcell-in -xamarin) – greece57

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