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

修改列单元格中的文本并使其成为超链接,listView WPF C#,c#,wpf,listview,C#,Wpf,Listview,现在我在listView的一列中显示,GridView是我的类的属性之一。这看起来或多或少: <ListView x:Name="offers_listView" Margin="38,185,35,81" > <ListView.View> <GridView> <GridViewColumn Width="100" Header="itemId" DisplayMemb

现在我在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为空,因此在浏览器中打开的链接不正确。我已经将这个想法直接调整到文本块,因为我粘贴我的代码如下:

                <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;
    }

私有void TextBlock_MouseDown(对象发送器,MouseButtonEventArgs e)
{
var urlPart2=((TextBlock)sender.Text;
//var urlPart=((超链接)发送者);
var fullUrl=string.Format(“http://allegro.pl/show_item.php?item={0},urlPart2);
Process.Start(新的ProcessStartInfo(fullUrl));
e、 已处理=正确;
}

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

例如,以下各项:

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

当然,更改url以执行任何您想执行的操作

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

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添加到资源后,我修改了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>


您需要在应用程序中加载网站页面还是在浏览器中打开它?@jan kowalski您的问题已经解决了吗?您好,我非常喜欢这个解决方案。因为一个问题,我稍微修改了一下,但它值得赏金,我非常感谢。我编辑了一篇解释我如何修改它的帖子。谢谢解决方案可能有效,而且确实很有趣,但是如果不需要,我更愿意不修改我的模型。无论如何,谢谢你。
<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>