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

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

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

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

WPF

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

Q&A

解決済

2回答

3272閲覧

【WPF・Prism】ListViewのDataTemplateに設定されたTextBoxが双方向Binding出来ない

ArutaVT

総合スコア1

C#

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

WPF

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

0グッド

0クリップ

投稿2021/05/11 01:12

編集2021/05/11 08:37

【WPF・Prism】ListViewのDataTemplateに設定されたTextBoxが双方向Binding出来ない

String型の配列を複数のTextBoxで表示し、編集出来るようにしたいです。
現在試している方法だと、双方向にBindingが出来ておらず、TextBox内のテキストを編集してもTextBlockのテキストにリアルタイムでデータが反映されません。
※プロパティの更新通知がPrismを使用しています。
ご教授いただければ幸いです。。。

View

XAML

1<!--編集用--> 2<ListView ItemsSource="{Binding textArray}"> 3 <ListView.ItemTemplate> 4 <DataTemplate> 5 <TextBox Text="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="25" Width="25"/> 6 </DataTemplate> 7 </ListView.ItemTemplate> 8</ListView> 9 10<!--確認用--> 11<ListView ItemsSource="{Binding textArray}"> 12 <ListView.ItemTemplate> 13 <DataTemplate> 14 <TextBlock Text="{Binding}" Height="25" Width="25"/> 15 </DataTemplate> 16 </ListView.ItemTemplate> 17</ListView> 18

###ViewModel

C#

1private ObservableCollection<string> _textArray; 2public ObservableCollection<string> textArray 3{ 4 get { return _textArray; } 5 set { SetProperty(ref _textArray, value); } 6} 7

試したこと

ListViewを使用せずにTextBoxとTextBlockに反映されるか確認すると、こちらはしっかりと反映されました。
大きな違いといえば、ListViewを使用していることくらいなのですが・・・
TextBoxのBinding設定が動いていないように思いますが、他に設定すべき項目があるのでしょうか?

開発環境

VisualStudio2019
Prism.Unity 8.0.0.1909

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

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

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

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

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

guest

回答2

0

ObservableCollectionはアイテムの増減の通知はしますが、個々の中身の変更は関知しません。
ObservableCollection<T> クラス (System.Collections.ObjectModel) | Microsoft Docs
INotifyCollectionChanged インターフェイス (System.Collections.Specialized) | Microsoft Docs

そもそもObservableCollection<string>ですと、ソースへの変更自体されていないですね(よくわかっていませんが^^;

個々のアイテムのほうにINotifyPropertyChangedを実装します。

xml

1<Window 2 x:Class="Questions337649.Views.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="800" 6 Height="450"> 7 <Grid> 8 <Grid.ColumnDefinitions> 9 <ColumnDefinition /> 10 <ColumnDefinition /> 11 </Grid.ColumnDefinitions> 12 <ListView HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}"> 13 <ListView.ItemTemplate> 14 <DataTemplate> 15 <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" /> 16 </DataTemplate> 17 </ListView.ItemTemplate> 18 </ListView> 19 20 <ListView Grid.Column="1" ItemsSource="{Binding Items}"> 21 <ListView.ItemTemplate> 22 <DataTemplate> 23 <TextBlock Text="{Binding Text}" /> 24 </DataTemplate> 25 </ListView.ItemTemplate> 26 </ListView> 27 </Grid> 28</Window>

cs

1using Prism.Mvvm; 2using System.Collections.ObjectModel; 3 4namespace Questions337649.ViewModels 5{ 6 public class MainWindowViewModel : BindableBase 7 { 8 public ObservableCollection<Item> Items { get; } 9 10 // アイテムの増減がないのであれば、配列でいいです。 11 //public Item[] Items { get; } 12 13 public MainWindowViewModel() 14 { 15 Items = new ObservableCollection<Item> 16 { 17 new Item { Text = "Item1" }, 18 new Item { Text = "Item2" }, 19 new Item { Text = "Item3" }, 20 }; 21 22 //Items = new Item[] 23 //{ 24 // new Item { Text = "Item1" }, 25 // new Item { Text = "Item2" }, 26 // new Item { Text = "Item3" }, 27 //}; 28 } 29 } 30 31 public class Item : BindableBase 32 { 33 private string _Text; 34 public string Text { get => _Text; set => SetProperty(ref _Text, value); } 35 } 36}

回答コードを書いているときに、↓にはまってしまい頭を抱えました^^;(string Text { get; set; }で動いてしまった)
wpf - Why does the binding update without implementing INotifyPropertyChanged? - Stack Overflow

投稿2021/05/11 08:50

編集2023/07/27 13:39
TN8001

総合スコア9862

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

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

ArutaVT

2021/05/11 09:28

ご回答ありがとうございます。 「ObservableCollectionはアイテムの増減の通知はしますが、個々の中身の変更は関知しません。」 ObservableCollectionが原因だったのですね・・・助かりました;; ちなみに貼っていただいたURLを少し読んでみたのですが、stringはインターフェイス実装しなくても実は動いてしまう事ありますよ、って内容で良いのでしょうか・・・?
TN8001

2021/05/11 09:51

私も自動翻訳で読んだだけなので、100%の自信はありません^^; stringに限定はされません。intでも同じでした。 回答コードをこうしてみてください。 public class Item { public string Text { get; set; } } それでも動いてしまいます。 ただし * パフォーマンスが悪い * メモリ効率も悪い * ViewModel側からの変更は反映されない * メモリリークの可能性がある と、何もいいことはありませんので、INotifyPropertyChangedを実装してください^^
ArutaVT

2021/05/11 09:53

* ViewModel側からの変更は反映されない これだけは知ってましたが、意外とコスパ悪いのですね・・・;; INotifyPropertyChangedを実装したいと思いますm(__)m 掘り下げた回答ありがとうございました!
guest

0

ベストアンサー

ObservableCollection<string>が通知可能なのはコレクションへの変更のみであって、中身のstringINotifyPropertyChangedを実装してないので通知可能ではないです。

なので<string>を通知可能なクラスに置き換える必要があります。

csharp

1public class BindableString : BindableBase 2{ 3 private string _InputText; 4 public string InputText 5 { 6 get => _InputText; 7 set => SetProperty(ref _InputText, value); 8 } 9} 10 11 12public ObservableCollection<BindableString> textArray; 13

xml

1<DataTemplate> 2 <TextBox Text="{Binding InputText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="25" Width="25"/> 3</DataTemplate>

投稿2021/05/11 08:56

tor4kichi

総合スコア769

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

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

tor4kichi

2021/05/11 08:58 編集

ページ更新せずに投稿したら回答被ってました…。無視してもらって構いません。
ArutaVT

2021/05/11 09:32

ご回答ありがとうございますm(__)m ご教授いただいた内容で、問題が解決いたしました! 原因とその解消方法がスッキリまとまっているので、ベストアンサーとさせていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問