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

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

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

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

WPF

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

Q&A

解決済

1回答

5017閲覧

WPF Prism TextBoxとList<string>のDataBinding

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

0グッド

1クリップ

投稿2019/08/31 13:57

Prism を用いてWPFアプリを作成しています。
TextBoxをList<string>のデータバインディングをしているのですが、プロパティが変わっても画面に反映されません。
そこで原因分かる方にご教示いただきたいです。

コードは以下の通りです。
コード内でLogsプロパティの文字列を追加しても画面に反映されません...

TextBox.xaml

<TextBox Text="{Binding Path=Logs,Converter={StaticResource ListToStringConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">

Bindingされているクラス

private List<string> _Logs; public List<string> Logs { get => _Logs; set => SetProperty(ref _Logs, value); }

ListToStringConverter

[ValueConversion(typeof(List<string>), typeof(string))] public class ListToStringConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { var src = value as IEnumerable<string>; if (src == null) return null; return string.Join(Environment.NewLine, src); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { var src = value as string; if (string.IsNullOrEmpty(src) == true) return new List<string>(); return src.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList(); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

案1.RaisePropertyChangedメソッドを通じて変更を強制通知する

List<T>の要素内容を更新しても、Logsプロパティへの直接の代入ではないためSetPropertyが呼び出されず、そのためTextBlock側にも変更通知されないので表示は更新されません。

単に改善するのであれば、Logsにstringを追加したタイミングで RaisePropertyChanged(nameof(Logs)) を呼び、プロパティ変更を強制的にTextBlock側へと通知すれば表示に反映されるかと思います。

案2.ItemsControlを使用した複数アイテム表示に切り替える

WPFでリスト内の複数要素を表示する場合はItemsControlやその派生のコントロール(ListViewComboBoxなど)を使用するのが一般的です。

ItemsControl
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.itemscontrol?view=netframework-4.8

この場合、質問で例示されているような文字列を連結するコンバーターは使用せずに、List<string>の文字列それぞれにTextBlockを与えて表示させる形になります。

ItemsControl等であれば文字列一行ごとのレイアウトを含む表示方法をDataTemplate経由で整えることができるため、デザイン的な柔軟性が確保できます。

また、ItemsControlを利用する場合は、List<T>からObservableCollection<T>に変更することで要素の増減に反応した表示の更新に手軽に対応することが出来ます。

ObservableCollection<T> Class
https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.objectmodel.observablecollection-1?view=netframework-4.8

ObservableCollection<T>を使う場合にはリスト要素操作に対してRaisePropertyChagedメソッドを呼び出す必要はありません。これはObservableCollection<T>が実装しているINotifyCollectionChangedインターフェイスを通じて、ItemsControlがリスト要素の変更を追跡してくれるようになるためです。

投稿2019/09/01 11:01

tor4kichi

総合スコア763

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

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

退会済みユーザー

退会済みユーザー

2019/09/01 13:45

直接代入では、SetPropertyが呼び出されないのですね。 案2のような方法もあるのですね。大変勉強になります。 今回はすぐ実装できる案1を採用させていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問