2015-06-01 5 views
3

я реализовал коллекцию элементов Hyperlink с использованием WPF:WPF ListView привязка к коллекции

var controlLinks = new List<Hyperlink>(); 

if (issueLinks != null) 
{ 
    foreach (var link in issueLinks) 
    { 
     var tempLink = new Hyperlink() 
     { 
      NavigateUri = new Uri(link.link) 
     }; 
     controlLinks.Add(tempLink); 
    } 
} 
ListIssueLinks.ItemsSource = controlLinks; 

коллекций успешно заполнены, теперь я свяжу ListIssueLinks просмотра этой коллекции.

<ListView Name="ListIssueLinks" Height="100" > 
    <ListView.View> 
     <GridView> 
      <GridViewColumn/> 
     </GridView> 
    </ListView.View> 
</ListView> 

Здесь у меня есть проблема, вопрос я новичок в WPF и не имею представления, как правильно осуществить форматирование (например, представить NavigateUri или имя только на UI) и реализовать общий обработчик нажмите на любой элемент. Что-то вроде этого:

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

Я попытался DataTemplate, пробовал много других варианты, гугл очень много, но до сих пор не имеет ни малейшего понятия, как это сделать. Не могли бы вы предложить любое легкое и элегантное решение?

+0

[Обзор привязки данных] (https://msdn.microsoft.com/en-us/library/ms752347 (v = vs.110) .aspx) – Sheridan

ответ

1

DataTemplate - ваш лучший выбор, вот как вы могли реализовать его в своем случае.

<ListView Name="ListIssueLinks" Height="100"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <TextBlock> 
      <Hyperlink NavigateUri="{Binding}" RequestNavigate="Link_RequestNavigate"> 
       <TextBlock Text="{Binding}" /> 
      </Hyperlink> 
     </TextBlock> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Затем в коде позади, я бы просто привязать непосредственно к issueLinks (нет необходимости наращивать HyperLink с в коде).

List<string> issueLinks = new List<string>() 
{ 
    "http://www.google.com", 
    "http://www.stackoverflow.com", 
}; 

ListIssueLinks.ItemsSource = issueLinks; 

Тогда ваш RequestNavigate обработчик событий должен начать процесс

private void Link_RequestNavigate(object sender, RequestNavigateEventArgs e) 
{ 
    System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(e.Uri.AbsoluteUri)); 
    e.Handled = true; 
} 
0

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

  1. ObservableCollection я думаю, вы должны рассмотреть его использовать вместо простого списка, поскольку она имеет преимущество, если вам нужно привязать список к просмотру с вашей ListView, например. для получения дополнительной информации читайте здесь: ObservableCollection Class

  2. Сторона XAML Вторая вещь, которую, я думаю, вы пытались объяснить, - это как использовать свойства и показать их в своем списке. это означает, что вам нужно записать его на стороне XAML и исследовать его дальше, вы можете связать свойства после этого с помощью inotifypropertychanged, если данные в списке будут меняться по любой причине.

надеюсь, что я помог.

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