2012-09-20 3 views
0

Я пытаюсь связать ObservableCollection элементов с ListPicker из инструментария Silverlight для Windows Phone. Я сделал это раньше, но в моем случае теперь мой ObservableCollection содержит элементы из пользовательского класса. Я не знаю, как получить каждое из свойств класса (для каждого элемента) для привязки к моему элементу ListPicker. Для того, чтобы лучше проиллюстрировать то, что у меня есть выглядит следующим образом:Как связать ObservableCollection с Listpicker

MainPage.xaml

<Grid.Resources> 
     <DataTemplate x:Name="SearchProviderItemTemplate"> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{Binding Favicon}" /> 
       <TextBlock Text="{Binding Name}" Margin="12,0,0,0"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Name="SearchProviderFullModeItemTemplate"> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{Binding Favicon}" /> 
       <TextBlock Text="{Binding Name}" Margin="12,0,0,0"/> 
      </StackPanel> 
     </DataTemplate> 
</Grid.Resources> 

<toolkit:ListPicker x:Name="SearchProviderListPicker" ItemsSource="{Binding SearchProvider}" Margin="12,0,12,0" 
          Header="Search provider" ItemTemplate="{Binding SearchProviderItemTemplate}" 
          FullModeHeader="Search provider" FullModeItemTemplate="{Binding SearchProviderFullModeItemTemplate}" 
          SelectedIndex="{Binding}" 
          SelectionChanged="SearchProviderListPicker_SelectionChanged" 
          CacheMode="BitmapCache"/> 

MainPage.xaml.cs

public MainPage() 
    { 
     InitializeComponent(); 

     //This data is placed here for convenience right now 
     ListItem Bing = new ListItem { Favicon = "", Name = "Bing", Address = "http://www.bing.com/search?q=" }; 
     ListItem Google = new ListItem { Favicon = "", Name = "Google", Address = "http://www.google.com/search?q=" }; 
     ListItem Yahoo = new ListItem { Favicon = "", Name = "Yahoo", Address = "http://search.yahoo.com/search?p=" }; 
     ListItem Ask = new ListItem { Favicon = "", Name = "Ask", Address = "http://www.ask.com/web?q=" }; 
     ListItem Aol = new ListItem { Favicon = "", Name = "AOL", Address = "http://search.aol.com/search?q=" }; 

     Settings.SearchProvider.Value.Add(Bing); 
     Settings.SearchProvider.Value.Add(Google); 
     Settings.SearchProvider.Value.Add(Yahoo); 
     Settings.SearchProvider.Value.Add(Ask); 
     Settings.SearchProvider.Value.Add(Aol); 

     // Set the data context of the SearchProviderListPicker control to the data 
     DataContext = App.ViewModel; 
    } 

MainViewModel.cs

public ObservableCollection<ListItem> SearchProvider { get; private set; } 

    public MainViewModel() 
    { 
     SearchProvider = Settings.SearchProvider.Value; 
    } 

Класс Настройки ссылки выше используется для хранения SearchProvider ObservableCollection в изолированном хранилище.

Settings.cs

public static Setting<ObservableCollection<ListItem>> SearchProvider = new Setting<ObservableCollection<ListItem>>("SearchProvider", new ObservableCollection<ListItem>()); 

И класс настройки сохраняет и получает данные из изолированного хранилища. Кроме того, мой собственный класс ListItem демонстрирует свойства, которые мне нужно использовать.

ListItem.cs

public string Favicon 
    { 
     get; 
     set; 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 

    public string Address 
    { 
     get; 
     set; 
    } 

Так в основном каждый SearchProvider ObservableCollection элемент содержит Favicon, Name, and Address, что мне нужно использовать, и я только хочу, чтобы связать Favicon и Name к ListPicker. Моя проблема заключается в том, что ListPicker представляет 5 поисковых провайдеров, за исключением текста для каждого сообщения: Project1.Common.ListItem, где находится класс ListItem в моей общей папке. Я не должен привязывать их правильно к виду, но я не знаю, как правильно это выполнить?

ответ

0

шаблоны вашего ListPicker являются статические ресурсы, определенные в Grid.Resources

Следовательно, вы должны изменить код ListPicker XAML, как в этом

ItemTemplate="{Binding SearchProviderItemTemplate}" 
FullModeItemTemplate="{Binding SearchProviderFullModeItemTemplate}" 

заменить вышеуказанные два свойства к следующему

ItemTemplate="{StaticResource SearchProviderItemTemplate}" 
FullModeItemTemplate="{StaticResource SearchProviderFullModeItemTemplate}" 
+0

Спасибо за ваш быстрый ответ. Я попробовал ваше решение, но теперь ничего не отображается в ListPicker? – Matthew

0

Если вы получаете «Project1.Common.ListItem» в качестве текста, который означает, что ваша привязка верна, но проблема с вашим шаблоном.

Первая поправка такая, как указано выше, вам нужно использовать «StaticResource» вместо «Binding», когда вы ссылаетесь на шаблоны.

Пожалуйста, перепроверьте шаблон для любых опечаток и т.д.

Если бы я тебя, я бы сначала попытаться заставить его работать без использования Настройки класса, см, если это помогает

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