修改列单元格中的文本并使其成为超链接,listView WPF C#

时间:2016-05-28 11:39:19

标签: c# wpf listview

现在我在listView的一个列中显示,GridView是我班级的一个属性。这看起来或多或少:

    <ListView x:Name="offers_listView"  Margin="38,185,35,81" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="100" Header="itemId" DisplayMemberBinding="{Binding Path=itemId}" />

ItemID是一个数字。

我想做的是根据此号码制作超链接。例如,从ItemId等于1234我想制作可点击的链接,以解决www.website.com/showItem.php?itemId=1234。最好的解决方案是,如果列仍然显示1234,但它是可点击链接到我提到的地址。当然,对于整个列表,每个项目都有不同的itemID属性。

任何人都可以给我一个提示如何做或者我可以提供的代码示例吗?

修改

以下解决方案已由我改编。

但是在逻辑方面NavigateUri已经为null,因此在浏览器中打开的链接不正确。我将这个想法直接改为文本块,因为我粘贴了下面的代码:

                <GridViewColumn Width="100" Header="itemLink">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=itemId}" MouseDown="TextBlock_MouseDown"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

    private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
    {
        var urlPart2 = ((TextBlock)sender).Text;
        //var urlPart = ((Hyperlink)sender).NavigateUri;
        var fullUrl = string.Format("http://allegro.pl/show_item.php?item={0}", urlPart2);
        Process.Start(new ProcessStartInfo(fullUrl));
        e.Handled = true;
    }

2 个答案:

答案 0 :(得分:3)

您需要更改GridViewColumn的单元格模板,以使列包含超链接。

例如,以下内容:

<GridViewColumn.CellTemplate>
  <DataTemplate>
    <TextBlock>
      <Hyperlink NavigateUri="{Binding Path=itemId}" RequestNavigate="Hyperlink_OnRequestNavigate">
        <TextBlock Text="{Binding Path=itemId}"/>
      </Hyperlink>
    </TextBlock>
  </DataTemplate>
</GridViewColumn.CellTemplate>

将使给定列填充超链接。默认情况下,WPF不对超链接执行任何操作,因此您必须自己添加一个处理程序来打开链接:

private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
  var urlPart = ((Hyperlink)sender).NavigateUri;
  var fullUrl = string.Format("http://www.website.com/showItem.php?itemId={0}", urlPart);
  Process.Start(new ProcessStartInfo(fullUrl));
  e.Handled = true;
}

当然,更改网址可以做任何你想做的事情。

答案 1 :(得分:2)

我已经为应用程序必须在浏览器中打开网页的情况创建了一个可重用的命令:

public class BrowseCommand : ICommand
{
    public virtual void Execute(object parameter)
    {
        var path = parameter as string;
        if (String.IsNullOrWhiteSpace(path) == false)
        {
            // if path is URL, start browser with selected page
            Process.Start(new ProcessStartInfo(path));
        }
    }

    public virtual bool CanExecute(object parameter)
    {
        var path = parameter as string;
        return !String.IsNullOrWhiteSpace(path);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    protected virtual void OnCanExecuteChanged(EventArgs e)
    {
        CommandManager.InvalidateRequerySuggested();
    }
}

BrowseCommand需要URL作为参数。我建议扩展视图模型并在那里声明url属性(基于Id),例如

public class ItemVm
{
    public int ItemId { get; set; }

    public string ItemUrl
    {
        get { return String.Format("http://stackoverflow.com/questions/{0}", ItemId); }
    }
}

最后一步是自定义视图。将BrowseCommand添加到Resources之后,我修改了CellTemplate(带下划线的文本)并附加了鼠标中键点击命令:

<ListView x:Name="offers_listView" Grid.Row="1" ItemsSource="{Binding Path=List}">
    <ListView.Resources>
        <local:BrowseCommand x:Key="BrowseCmd"/>
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="100" Header="ItemId">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=ItemId}" 
                                   Cursor="Hand" TextDecorations="Underline">
                            <TextBlock.InputBindings>
                                <MouseBinding Gesture="MiddleClick" 
                                              Command="{StaticResource BrowseCmd}" 
                                              CommandParameter="{Binding Path=ItemUrl}"/>
                            </TextBlock.InputBindings>
                        </TextBlock>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>