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

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

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

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

WPF

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

Q&A

解決済

1回答

3905閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

0グッド

0クリップ

投稿2018/11/01 10:08

編集2018/11/01 14:03

できるだけ頑張ってみましたが詰まってしまったので詳しい方いましたらご教示ください。
このサイトの説明の通り画面遷移するプログラムを作ることができました。

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

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

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

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

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

MainWindows.xaml

<Window x:Class="MVVM.MainWindow" //不必要な部分はカット Title="MainWindow" Height="450" Width="800"> <Grid> <Button Content="Button" HorizontalAlignment="Left" Margin="10,139,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.24,1.068" Click="Button_Click"/> <Button Content="Button" HorizontalAlignment="Left" Margin="10,183,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.24,1.068" Click="Button_Click_1"/> <Frame Grid.Row="1" NavigationUIVisibility="Hidden" Name="Frame" Margin="160,0,0,0" Background="Black"/> </Grid> </Window>

MainWindows.xaml.cs

public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Navi = this.Frame.NavigationService; } private NavigationService Navi; private List<Uri> UriList = new List<Uri>() {new Uri("Home.xaml",UriKind.Relative), new Uri("Setting.xaml",UriKind.Relative),}; private void Button_Click(object sender, RoutedEventArgs e) { Navi.Navigate(UriList[0]); } private void Button_Click_1(object sender, RoutedEventArgs e) { Navi.Navigate(UriList[1]); } }

Home.xaml

<Page x:Class="MVVM.Home" //不必要な部分はカット Title="Home"> <Grid Background="#FFFF0202"/> </Page>

Home.xaml.cs*

namespace MVVM { public partial class Home : Page { public Home() { InitializeComponent(); } } }

Setting.xaml

<Page x:Class="MVVM.Setting" //不必要な部分はカット Title="Setting"> <Grid Background="White"> <TextBox HorizontalAlignment="Left" Height="23" Margin="263,163,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Text="{Binding username}"/> </Grid> </Page>

Setting_ViewModel.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; namespace MVVM { class Setting_ViewModel :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)); } } } }

Setting.xaml.cs

namespace MVVM { /// <summary> /// Setting.xaml の相互作用ロジック /// </summary> public partial class Setting : Page { public Setting() { InitializeComponent(); IdTextBox.DataContext = setting_class; } Setting_ViewModel setting_class = new Setting_ViewModel(); } }

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

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

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

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

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

Zuishin

2018/11/01 11:22

XAML の方も追記してください。リンク先を見てみましたが、これとは少し違うようです。
退会済みユーザー

退会済みユーザー

2018/11/01 14:04

状況を説明できる簡単なプロジェクトつくってコード修正しました。宜しければご一読ください。
guest

回答1

0

ベストアンサー

Page は遷移するたびに新しく作り直されます。
ですから、そこで ViewModel を作ったのではいけません。
そのたびにリセットされることになります。
シングルトンパターンを使って次のようにしてください。

Setting.xaml.cs 抜粋

C#

1public partial class Setting : Page 2{ 3 public Setting() 4 { 5 InitializeComponent(); 6 DataContext = Setting_ViewModel.Instance; 7 } 8}

Setting_ViewModel.cs 抜粋

C#

1class Setting_ViewModel : INotifyPropertyChanged 2{ 3 private Setting_ViewModel() { } 4 5 private static Setting_ViewModel instance = null; 6 public static Setting_ViewModel Instance 7 { 8 get 9 { 10 if (instance == null) 11 { 12 instance = new Setting_ViewModel(); 13 } 14 return instance; 15 } 16 } 17 // 以下略

投稿2018/11/01 14:18

Zuishin

総合スコア28656

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

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

退会済みユーザー

退会済みユーザー

2018/11/01 14:30

Setting_ViewModelクラスでインスタンス化するんですね....本当勉強になります。 ネットの記事もないことやwpf体系的に学べる本も少ないので本当助かりました。 サンプルコードやTeratailを通してもっと強くなります!ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/11/01 14:43

デザインパターン真剣に取り組んでみます。GOF楽しみながらみます。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問