c#-WPF ListView绑定到集合

我使用WPF实现了一系列超链接元素:

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的新手,不知道如何正确实现格式设置(例如,仅在UI上显示NavigateUri或Name)并实现用于单击任何元素的通用处理程序.像这样:

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

我尝试了DataTemplate,尝试了许多其他变体,用Google搜索了很多,但是仍然不知道如何做到这一点.您能否提出任何简单而优雅的解决方案?

解决方法:

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(无需在代码中构建HyperLinks).

List<string> issueLinks = new List<string>()
{
    "http://www.google.com",
    "http://www.*.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;
}
上一篇:c#-ms-windows-store://上的Windows Store应用程序URL-现在坏了吗?


下一篇:C#-WPF的XAML:空白的工具提示文本时隐藏工具提示弹出窗口