2016-05-28 5 views
2

今のところ私はlistViewの列の1つ、GridViewのクラスの1つのプロパティに表示しています。これは多かれ少なかれ見えます:列セル内のテキストを変更してハイパーリンクにする、listView WPF C#

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

アプリケーションでWebサイトのページをロードするか、ブラウザで開く必要がありますか? – ASh

+0

@ jan-kowalskiに問題が解決しましたか? – FriendlyGuy

答えて

2

あなたが列にハイパーリンクが含まれている持つために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; 
} 

、あなたがやりたいものは何でもへの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が必要です。

+0

こんにちは、私はこのソリューションが本当に好きです。 1つの問題のために少し修正しましたが、それは恩恵の価値があり、とても感謝しています。どのように私がそれを変更するか説明する投稿を編集しました。ありがとう! –

2

私は、アプリケーションがブラウザでWebページを開くことがあるような状況のための再利用可能なコマンドを作成しました。私は、ビューモデルを拡張し、(Idに基づいて)そこにURLプロパティを宣言することをお勧めします。

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> 
+0

解決策はうまくいくかもしれませんが、実際には面白いですが、必要がない場合はモデルを変更しない方がよいでしょう。とにかくありがとうございました。 –

関連する問題