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

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

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

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

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

WPF

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

Q&A

解決済

1回答

28612閲覧

WPF データバインディングの更新方法が分かりません。

gucha

総合スコア55

C#

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

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

WPF

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

0グッド

1クリップ

投稿2017/09/18 18:37

初歩的な所でつまづいています。とりあえず動かそうと正しい知識を付けずに間違った使い方をしていると思いますので手ほどきよろしくお願いします。

XAML

XAML

1 <Grid> 2 <StackPanel> 3 <Label Content="{Binding labelA}"/> 4 <Label Content="{Binding labelB}"/> 5 <Button x:Name="btn1" Content="Button1" Click="btn1_Click"/> 6 <Button x:Name="btn2" Content="Button2" Click="btn2_Click"/> 7 </StackPanel> 8 </Grid>

MainWindow.xaml.cs

MainWindow.xaml.cs

1 public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 InitializeComponent(); 6 this.DataContext = new { labelA = "A", labelB = "B" }; 7 } 8 9 private void btn1_Click(object sender, RoutedEventArgs e) 10 { 11 this.DataContext = new { labelA = "A+", labelB = "B+" }; 12 } 13 14 private void btn2_Click(object sender, RoutedEventArgs e) 15 { 16 this.DataContext = new { labelA = "A++"}; 17 } 18 }

やりたいこと:
Bindingを利用してコードのイベントから値を操作したい。

起こっている問題:
初期値を入れる書き方しか知らないので、イベントbtn2_Clickのような場合に値を作っていないlabelBが消えてしまう。
全部のイベントに全部のパスを書くのは量が増えると管理が難しくなる。

毎回全てのパスの値を作成しなくても良い方法を教えてください。
初期値以外をイベントからの更新の方法?

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

DataContextを毎回入れ替えるのではなく、DataContext内の各プロパティを変更時に、変更通知を行うことでバインドしたUIは更新されます。

INotifyPropertyChangedを実装したインスタンスをDataContextとすることで、どのプロパティが変更したかをUIへ通知できます。

csharp

1public partial class MainWindow : Window 2{ 3 public MainWindow() 4 { 5 InitializeComponent(); 6 //this.DataContext = new { labelA = "A", labelB = "B" }; 7 _viewModel = new MainWindowViewModel { labelA = "A", labelB = "B" }; 8 this.DataContext = _viewModel; 9 } 10 11 private MainWindowViewModel _viewModel; 12 13 private void btn1_Click(object sender, RoutedEventArgs e) 14 { 15 //this.DataContext = new { labelA = "A+", labelB = "B+" }; 16 _viewModel.labelA = "A+"; 17 _viewModel.labelB = "B+"; 18 } 19 20 private void btn2_Click(object sender, RoutedEventArgs e) 21 { 22 //this.DataContext = new { labelA = "A++" }; 23 _viewModel.labelA = "A++"; 24 } 25} 26 27public class MainWindowViewModel : INotifyPropertyChanged 28{ 29 private string _labelA; 30 public string labelA 31 { 32 get { return _labelA; } 33 set { 34 _labelA = value; 35 OnPropertyChanged("labelA"); 36 } 37 } 38 39 private string _labelB; 40 public string labelB 41 { 42 get { return _labelB; } 43 set { 44 45 _labelB = value; 46 OnPropertyChanged("labelB"); 47 } 48 } 49 50 public event PropertyChangedEventHandler PropertyChanged; 51 private void OnPropertyChanged(string propertyName) 52 { 53 this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 54 } 55}

投稿2017/09/18 22:28

編集2017/09/18 22:32
Tak1wa

総合スコア4791

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

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

gucha

2017/09/19 15:50

直して頂いたコードを参考にして思い通りに動かすことができました。 忘れない内にINotifyPropertyChangedを勉強します。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問