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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

WPF

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

Q&A

解決済

2回答

7584閲覧

WPF 複数行テキストボックスに(string)配列をバインドしたい

ElecDove

総合スコア254

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

WPF

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

0グッド

0クリップ

投稿2017/08/08 10:15

いつもありがとうございます.

①WPFの複数行テキストボックスにstringの配列(リスト)をバインド(配列の要素は改行で区切る)するにはどうすれば良いのでしょうか
調べているのですが,私の探し方が悪いようで見つけることができませんでした


②また,バインドではなくC#からアクセスするには
LineCountGetLineText(index)を使ってfor等ループで受け取ることになりますでしょうか
(他にもっと適した書き方があれば教えてください)


③逆に,配列を(改行で区切りながら)テキストボックスにいれて行く場合は
+"\n"
を使って配列を結合して行けば良いでしょうか


以上三点よろしくお願いいたします.

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

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

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

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

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

guest

回答2

0

ベストアンサー

①に関してはConverterで対応できると思います。

以下のような 「List<string> <-> 改行で分割されつ文字列」変換用Coverterを用意

C#

1public class StringLineConverter : IValueConverter 2{ 3 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 4 { 5 var src = value as IEnumerable<string>; 6 if (src == null) 7 return null; 8 return string.Join(Environment.NewLine, src); 9 } 10 11 public object ConvertBack(object value, Type targetTypes, object parameter, System.Globalization.CultureInfo culture) 12 { 13 var src = value as string; 14 if (string.IsNullOrEmpty(src) == true) 15 return new List<string>(); 16 return src.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList(); 17 } 18}

対応するViewModelとプロパティを用意
(このあたりの知識はお持ちであること前提です)

C#

1//ViewModel 2public List<string> _Lines; 3public List<string> Lines 4{ 5 get 6 { 7 return _Lines; 8 } 9 set 10 { 11 _Lines = value; 12 RaisePropertyChanged(()=> Lines); 13 } 14}

BindしてConverterで相互変換

XAML

1 <Window.Resources> 2 <local:StringLineConverter x:Key="Cnv"/> 3 </Window.Resources> 4 5 <TextBox AcceptsReturn="True" Text="{Binding Path=Lines,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, Converter={StaticResource Cnv}}"/> 6

②、③にかんしても、TextBox内の文字列をConveterで変換してるとの同じ方法で変換できると思います。

投稿2017/08/08 12:18

ebiryo

総合スコア797

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

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

ElecDove

2017/08/08 20:37

回答ありがとうございます Converterという概念があるのですね 大変勉強になりました
guest

0

WPFでコードバインディングを行うには次のことを行う必要があります。

  • クラスにINotifyPropertyChangedインターフェースを実装する
  • バインドしたいものはプロパティで実装。
  • Set側にプロパティ通知を行うイベントであるPropertyChangedEventHandlerを発火させる駆動を実装する。

その仕掛けを施したクラスについては下の通りで、それ以外にもMainWindowクラス側のどこかでテキストボックス側のDataContextプロパティに当該クラスのインスタンスを代入する必要があります。

そしてXAML側でバインドしたいテキストボックスのタグの中にText="{Binding Path=StringList}"を追加することでデータバインドを行えます。

C#

1 2 class BindItem : INotifyPropertyChanged 3 { 4 public event PropertyChangedEventHandler PropertyChanged; 5 6 private void NotifyPropertyChanged(string PropertyName) 7 { 8 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName)); 9 } 10 11 public BindItem() 12 { 13 _stringList = new List<string>(); 14 } 15 16 private List<string> _stringList; 17 18 public string StringList 19 { 20 get 21 { 22 var response = new StringBuilder(); 23 24 foreach (var message in _stringList) 25 { 26 response.Append(message + "\n"); 27 } 28 29 return response.ToString(); 30 } 31 32 set 33 { 34 _stringList.Add(value); 35 NotifyPropertyChanged(nameof(StringList)); 36 } 37 } 38 }

投稿2017/08/08 11:01

Argent

総合スコア59

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問