2014-12-03 1 views
0

У меня есть список, заполненный элементами. Каждый элемент содержит объект следующим образом:Различные стиль списка элементов в соответствии с данными WP 8.1

public Contact(int idContact, string pseudo, string prenom, string nom, string numero, bool isOuter) 
    { 
     this.IdContact = idContact; 
     this.Pseudo = pseudo; 
     this.Prenom = prenom; 
     this.Nom = nom; 
     this.NumerosTel = numero; 
     this.IsOuter = isOuter; 
    } 

Теперь я хотел бы применить другой стиль для этих элементов в соответствии с значением IsOuter, как это логическое значение. Я слышал о DataTemplateSelector, но не могу понять, как это работает ... Кто-нибудь может показать мне, как это сделать?

ответ

1

Первый, вы создаете DataTemplateSelector вроде этого:

public class MyTemplateSelector : DataTemplateSelector { 
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { 
     var contact = (Contact)item; 

     if (contact.IsOuter == true) { 
      return (DataTemplate)Application.Current.Resources["DataTemplate1Name"]; 
     } else { 
      return (DataTemplate)Application.Current.Resources["DataTemplate2Name"]; 
     } 
    } 
} 

В этом коде DataTemplates должны быть в App.xaml. В принципе, метод должен возвращать DataTemplate, который вы хотите как объект DataTemplate. Как вы получите этот объект полностью зависит от вас.

Второй, вам необходимо установить ItemTemplateSelector в ListBox, как это:

listbox.ItemTemplateSelector = new MyTemplateSelector(); 

И это все. Теперь разные элементы будут иметь разные шаблоны, основанные на свойстве IsOuter.

Некоторые мысли

Вы можете иметь несколько более многоразовые селекторы шаблонов. Например, у вас может быть интерфейс с одним свойством DataTemplate, а в SelectTemplateCore проверить, реализует ли этот элемент интерфейс, и если да - вернуть значение этого свойства.

В любом случае, код выше должен работать до сих пор, и если вам нужно больше DataTemplateSelector s в будущем, вы найдете наиболее удобный способ для их записи/использования. :)

+0

Спасибо за ответ и советую! В соответствии с вышеприведенным кодом, как ressources, мне нужно иметь 2 DataTemplate с именем DataTemplate1 и DataTemplate2 в моих ресурсах с правами на страницы? –

+1

Я немного изменил свой ответ. Вы должны поместить два шаблона в App.xaml или настроить код, чтобы получить из ресурсов текущей страницы, или, возможно, добавить свойства для двух шаблонов в класс MyTemplateSelector и установить их при создании своего экземпляра. Но App.xaml является самым простым. :) – yasen

+0

Большое спасибо! Отличные ответы! Это работает хорошо :) –