いつもありがとうございます.
①WPFの複数行テキストボックスにstringの配列(リスト)をバインド(配列の要素は改行で区切る)するにはどうすれば良いのでしょうか
調べているのですが,私の探し方が悪いようで見つけることができませんでした
②また,バインドではなくC#からアクセスするには
LineCount
とGetLineText(index)
を使ってfor等ループで受け取ることになりますでしょうか
(他にもっと適した書き方があれば教えてください)
③逆に,配列を(改行で区切りながら)テキストボックスにいれて行く場合は
+"\n"
を使って配列を結合して行けば良いでしょうか
以上三点よろしくお願いいたします.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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
総合スコア797
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
総合スコア59
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/08 20:37