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

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

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

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

WPF

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

Q&A

解決済

1回答

2395閲覧

WPF ページ遷移時の値の保持について

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

0グッド

0クリップ

投稿2018/11/01 04:17

編集2018/11/01 08:13

このサイトの説明の通り画面遷移するプログラムを作ることができました。

WPFサンプル:NavigationServiceを使ったページ遷移

ですがページA→ページB→ページAと移動するとページAのテキストボックスに入力されていた値が保持されません。

オブジェクトのプロパティをTextBoxに割り当てています。

①PageAを読み込むとSettingクラスのオブジェクトsetting_classが生成。
②PageAのTextBoxに値が入力される
③BindingしてあるSettingクラスのusernameプロパティが入力された値になる
④違いページに移動
⑤再びPageAに戻る
⑥PageAのコンストラクタでSettingクラスのオブジェクトsetting_classがテキストボックスに割り当てられる

これでページ遷移して値が保存されることを実現できるかと思ったのですがうまくいかないです。
原因分かる方いましたらご協力をお願いします。

MainWindows.xaml

public MainWindow() { InitializeComponent(); Navi = this.Frame.NavigationService; } //フィールドに定義 private NavigationService Navi; private List<Uri> UriList = new List<Uri>() {new Uri("PageA.xaml",UriKind.Relative), new Uri("PageB.xaml",UriKind.Relative),}; private void ListMenu_SelectionChanged(object sender, SelectionChangedEventArgs e) { int index = ListMenu.SelectedIndex; switch (index) { case 0: Navi.Navigate(UriList[0]); break; case 1: Navi.Navigate(UriList[1]); break; default: break; } }

PageA

public partial class PageA : Page { public PageA() { InitializeComponent(); //TextBoxにオブジェクトのプロパティを割り当てる TextBox.DataContext = setting_class; } //オブジェクトの生成 Setting setting_class = new Setting { }; }

PageA_Model.cs

//クラスの定義 class Setting : INotifyPropertyChanged { private string username_value; public string username { get { return username_value; } set { username_value = value; NotifyPropertyChanged("username"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } }

PageA.xaml

<TextBox x:Name="TextBox" Text="{Binding username}"> </TextBox>

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

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

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

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

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

Zuishin

2018/11/01 04:51

なぜそれ以外の方法なのでしょう? その理由によって回答は変わってくると思います。
退会済みユーザー

退会済みユーザー

2018/11/01 04:57

追記修正依頼ありがとうございます。質問を修正しましたので宜しければご一読ください。
Zuishin

2018/11/01 05:00

保存ボタンが不要で常に保存されるとしたらどうでしょう? このケースだとデータバインディングするのが常套手段ですが。
guest

回答1

0

ベストアンサー

データバインディングという技術があります。

第5回 WPFの「データ・バインディング」を理解する (1/3)

これを使うと、テキストボックスに入力した文字列と他のオブジェクトの文字列が同期します。例えば Text プロパティを持つオブジェクトを作り、その Text プロパティをテキストボックスの Text プロパティとバインドすると、このどちらを変えてもバインドされたもう一つのプロパティが変わります。

すると、画面遷移してもテキストボックスの中身はそのオブジェクトに引き継がれるので残るということです。

投稿2018/11/01 05:31

Zuishin

総合スコア28660

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

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

退会済みユーザー

退会済みユーザー

2018/11/01 07:25

回答ありがとうございます。読ませていただきました。 ビューの変更は自動的にオブジェクトに同期(逆はちょっと面倒みたいですが)されるので実現できそう!って思ってコード書きましたが、どうしてもうまくいかないです。 よろしければ解決策ご教示いただけますと幸いです。
Zuishin

2018/11/01 07:30

Setting は INotifyPropertyChanged を実装する必要があります。 ちょっと今コード書けないのでググってください。すぐ見つかると思います。
退会済みユーザー

退会済みユーザー

2018/11/01 07:38

迅速な回答ありがとうございます!もう少し頑張ってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問