質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

3877閲覧

WPF XAML : Binding文字列の一部のBindingについて

yamamoto_001

総合スコア17

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/06/04 09:27

編集2019/06/05 02:23

VB.NET + WPF + XAML (MVVM prismフレームワーク)で開発しております。

DataGrid内のある列内の文字列の一部に特定の文字列が含まれている場合、そこをHyperlinkにしてCommandをバインドするということが
出来ないか模索しております。
何か良い方法があればご教授お願い致します。

例)

VB

1Public Class Person 2 Public Property Name As String 3 Public Property Description As String 4End Class 5 6Public Property Persons As New List(Of Person) 7 8Public Sub New() 9Persons.Add(New Person() With { .Name="織田信長", .Description="織田信長は、(注%織田弾正忠家の当主%)・(注%織田信秀の子%)に生まれ、・・・"}) 10Persons.Add(New Person() With { .Name="豊臣秀吉", .Description="初め(注%木下氏%)で、後に(注%羽柴氏%)に改める。・・・"}) 11End Sub

Xaml

1 <DataGrid HeadersVisibility="Column" VerticalAlignment="Top" HorizontalAlignment="Left" 2 AutoGenerateColumns="False" CanUserSortColumns="False" CanUserResizeColumns="False" CanUserAddRows="False" 3 ItemsSource="{Binding Path=Persons}"> 4 <DataGrid.Columns> 5 <DataGridTextColumn Header="名前" Binding="{Binding Path=Name}"/> 6 <DataGridTemplateColumn Header="説明"> 7 <DataGridTemplateColumn.CellTemplate> 8 <DataTemplate> 9 <TextBlock Text="{Binding Path=Description}"/> 'ここを(注%〇〇〇%)の部分だけHyperlinkにしてCommand={Binding viewCommand} CommandParameter="〇〇〇" みたいにしたい 10 </DataTemplate> 11 </DataGridTemplateColumn.CellTemplate> 12 </DataGridTemplateColumn> 13 </DataGrid.Columns>

質問内容の修正依頼をいただきましたので、加筆させていただきます。

上記例の場合、(注%木下氏%) や(注%羽柴氏%)のように中身が異なる特定の文字列として複数存在します。
(”木下氏”や”羽柴氏"の部分のみ異なる)
Description内での(注%〇△%)の数は決まっていません。(0個の場合もあるし、10個の場合もある)
中身はすべて異なる場合もありますし、一部重複する可能性もあります。

Bindするコマンドは1つで中身をコマンドパラメータでと考えています。

以上、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ebiryo

2019/06/05 01:52

Descriptionの中には「特定の文字列」は複数存在するのでしょうか。 複数存在する場合、その文字列はすべて異なる可能性はあるのでしょうか。 すべて異なる可能性がある場合、Bindするコマンドも複数存在するのでしょうか。
guest

回答2

0

ベストアンサー

通常のTextBlockだけでは難しいのでは?
UserControlを作成して自前でDescriptionを解析する以外方法はないように思います。

簡単なサンプルを作ってみました。それらしく動作していように思います。
※手慣れたC#で作りましたが、本質な違いはないはず。

ご参考までに。

XAML

1<!-- Gridに配置するUserControl --> 2<UserControl x:Class="WpfApplication1.HyperLinkEx" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 7 xmlns:local="clr-namespace:WpfApplication1" 8 mc:Ignorable="d" 9 d:DesignHeight="300" d:DesignWidth="300"> 10 <TextBlock Name="_Content"/> 11</UserControl>

c#

1/// <summary> 2/// HyperLinkEx.xaml の相互作用ロジック 3/// </summary> 4public partial class HyperLinkEx : UserControl 5{ 6 /// <summary> 7 /// Descriptiontとして表示する文字列 8 /// </summary> 9 public string TextContent 10 { 11 get { return (string)GetValue(TextContentProperty); } 12 set { SetValue(TextContentProperty, value); } 13 } 14 public static readonly DependencyProperty TextContentProperty = 15 DependencyProperty.Register("TextContent", typeof(string), typeof(HyperLinkEx), new PropertyMetadata(null,(v1,v2)=> 16 { 17 (v1 as HyperLinkEx)?.UpdateContents(); 18 })); 19 20 21 /// <summary> 22 /// 特定文字クリック時に発火するコマンド 23 /// </summary> 24 public ICommand LinkCommand 25 { 26 get { return (ICommand )GetValue(LinkCommandProperty); } 27 set { SetValue(LinkCommandProperty, value); } 28 } 29 public static readonly DependencyProperty LinkCommandProperty = 30 DependencyProperty.Register("LinkCommand", typeof(ICommand ), typeof(HyperLinkEx), new PropertyMetadata(null,(v1,v2)=> 31 { 32 (v1 as HyperLinkEx)?.UpdateContents(); 33 })); 34 35 public HyperLinkEx() 36 { 37 InitializeComponent(); 38 } 39 40 void UpdateContents() 41 { 42 this._Content.Inlines.Clear(); 43 if (string.IsNullOrEmpty(this.TextContent) == true || LinkCommand == null) 44 return; 45 46 //特定文字用パターン文字列 47 var pattern = @"(\%.+?\%)"; 48 49 //特定文字とそれ以外に分割 50 var items = Regex.Split(TextContent, pattern); 51 52 foreach( var item in items ) 53 { 54 //特定文字ならHyperLink 55 if( Regex.Match(item, pattern).Success) 56 { 57 var hyperlink = new Hyperlink(new Run(item.Replace("%", ""))) 58 { 59 Command = LinkCommand, 60 CommandParameter = item 61 }; 62 _Content.Inlines.Add(hyperlink); 63 } 64 else 65 { 66 _Content.Inlines.Add(new Run(item)); 67 } 68 } 69 } 70}

使い方:

XAML

1 <Grid> 2 <DataGrid HeadersVisibility="Column" VerticalAlignment="Top" HorizontalAlignment="Left" 3 AutoGenerateColumns="False" CanUserSortColumns="False" CanUserResizeColumns="False" CanUserAddRows="False" 4 ItemsSource="{Binding Path=Persons}"> 5 <DataGrid.Columns> 6 <DataGridTextColumn Header="名前" Binding="{Binding Path=Name}"/> 7 <DataGridTemplateColumn Header="説明"> 8 <DataGridTemplateColumn.CellTemplate> 9 <DataTemplate> 10 <local:HyperLinkEx TextContent="{Binding Path=Description}" LinkCommand="{Binding Path=Command}"/> 11 </DataTemplate> 12 </DataGridTemplateColumn.CellTemplate> 13 </DataGridTemplateColumn> 14 </DataGrid.Columns> 15 </DataGrid> 16 </Grid>

投稿2019/06/05 04:16

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamamoto_001

2019/06/05 07:32

教えていただいた方法で実現したかったことがばっちりできました。 迅速で丁寧なご回答本当にありがとうございました。
guest

0

それなりに手間のかかる仕事になります。FlowDocument をホストするカスタムコントロールを作ってデータテンプレートとして使うことになるのではないでしょうか。勉強する気があるならしてもいいし、する気がないなら他の UI を考えるかプロに頼まなければいけないかもしれません。

方法: ハイパーリンクに下線を引くかどうかを指定する

投稿2019/06/04 15:54

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問