2014-11-22 4 views
1

Я работаю над локальным проектом, и у меня есть некоторые проблемы.WPF templating with ObservableCollection

Я хочу создать шаблон для некоторых результатов, у которых есть 3 строки (где 1 - гиперссылка) и изображение, и они входят как ObservableCollection типа результатов, привязанного к ItemSource.

public TestClass { 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Link { get; set; } 
    public BitmapImage Thumbnail { get; set; } 
} 

Итак, я хочу, чтобы показать эти результаты в WPF, и я хочу использовать для каждого элемента шаблона и показать их в StackPanel (или ListView).

Я попытался с помощью ListView, но единственное, что вы можете сделать, это выбрать весь элемент, но я хочу, чтобы ссылка была доступна для клика.

Моя проблема: как я могу создать шаблон для использования на каждом элементе, а затем добавить их в список, который можно использовать с помощью одной строки?

+0

Вы уверены, что не просто неправильно указали ссылку? Является ли он настроен на то, чтобы попасть в тестовый тест? Событие клика должно ударить этот элемент управления * первым *. – BradleyDotNET

+0

Замените «ListView» на «ItemsControl» и используйте свой собственный шаблон. Привяжите 'ItemsSource'' ItemsControl' к вашей 'Collection'. – Unflux

ответ

0

Как упоминалось в Unflux, это хороший способ сделать это. А что касается кликабельной ссылки, используйте элемент управления Hyperlink, как показано ниже.

<ItemsControl ItemsSource="{Binding Persons}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding FirstName}" Grid.Row="0" Grid.Column="0" /> 
       <TextBlock Text="{Binding LastName}" Grid.Row="0" Grid.Column="1" /> 
       <TextBlock Text="{Binding Age}" Grid.Row="0" Grid.Column="2" /> 
       <TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3"> 
        <Hyperlink NavigateUri="{Binding BlogAddress}" Click="Hyperlink_OnClick"> 
         <TextBlock Text="{Binding BlogAddress}" /> 
        </Hyperlink> 
       </TextBlock>       
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

и код-за

private void Hyperlink_OnClick(object sender, RoutedEventArgs e) 
{ 
    var link = sender as Hyperlink; 
    Process.Start(link.NavigateUri.ToString()); 
} 

приводит

screenshot of demo

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

0

Благодаря идее использования ItemsControl с его шаблоном. Но Hyperlink I заставил его работать с функцией Click и присвоить ей a:

public ICommand RunHyperlink { 
    get { 
     return new ActionCommand(this.ButtonClick); 
    } 
} 

private void ButtonClick() { 
     Process.Start(new ProcessStartInfo(this.Link)); 
} 
+0

Да, конечно, есть много способов, как это сделать. Поскольку это ваш первый вопрос, я прошу вас не забывать отмечать ответ, который помог вам (в данном случае мой) принять его, щелкнув галочку ниже контрольного элемента вверх, рядом с ним. Спасибо и приветствую. –