2016-07-08 40 views
2

ページ間に単純な文字列を渡そうとしていますが、わかりません。ページ間でデータを渡すC#WPF

私はボタンをクリックし、テストアプリ、「」今、次のページ(Page1.xaml.cs)

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     string a = "hello"; 

     Page2 p2 = new Page2(); 
     NavigationService.Navigate(p2, a); 
    } 

に渡します、私はデータを抽出したいの値を作成ページ1(Page2.xaml.cs)から

private void NavigationService_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
     string str = (string)e.ExtraData; 
    } 

そして、しかし、私コンストラクタ(Page2.xaml.cs)

public Page2() 
    { 
     InitializeComponent(); 
     NavigationService.LoadCompleted += NavigationService_LoadCompleted; 
    } 

にサブスクライブ私はエラーが発生したプログラムを走らせた。誰かが私が逃しているものを指摘できますか?

+0

すでに同様の質問があります。[ここ]です(http://stackoverflow.com/questions/37955612/how-can-i-transfer-parameter-from-one-page-to)。 -another/37977367#37977367)。 –

答えて

0

テキストボックスDataContextを設定する代わりに、ページ全体のdatacontextをいくつかのクラス、つまりpage1のViewModelに設定します。 INotifyPropertyChangedインターフェイスを実装し、文字列プロパティのセットでNotifyPropertyChanged( "ElementName")が生成されていることを確認します。

このような対応するビューモデルを使用して新しいビューを作成します。これは、インタフェースINotifyPropertyChangedも実装する必要があります。テキストボックスを作成し、最初のページのように文字列プロパティにバインドします。 TwoWayデータが変更されている間、ターゲットとソースの両方が確実に更新されるように両方のプロパティをバインドしてください。

MainWindowで両方のviewModelのインスタンスを作成します。ユーザーが2番目のユーザーコントロールに移動するときに、

Page2ViewModel.TextBoxString = Page1ViewModel.TextBoxString; 

Page2からPage1にナビゲートするときは、このように設定します。

Page1ViewModel.TextBoxString = Page2ViewModel.TextBoxString; 

この方法では、両方のテキストボックスには、ナビゲーション中に更新されます。 これは単なる全体的な考えです。 MVVMとWPFについては、いくつかのチュートリアルから学ぶ必要があります。 Googleで検索してください。

1

いいえMinimal, Complete, and Verifiable code exampleがなければ、あなたの質問に対処するために必要なすべてを確実に知ることは不可能です。しかし、ナビゲートする際に、あるページから次のページへのデータの受け渡し方法が必要な場合は、NavigationService.Navigate(object, object)オーバーロードが役立つと思われます。

2番目のパラメータは、渡すデータです。ターゲットページでNavigationService.LoadCompletedイベント(または希望する任意の適切なイベント)を処理できます。Navigate()メソッドに渡されたオブジェクト値はNavigationEventArgs.ExtraDataプロパティで取得できます。

たとえば、あなたの最初のページに:

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    Page2 p2 = new Page2(); 
    NavigationService.Navigate(p2, v.str); 
} 

、あなたの2番目のページに:もちろん

private void NavigationService_LoadCompleted(object sender, NavigationEventArgs e) 
{ 
    string str = (string)e.ExtraData; 

    // do whatever with str, like assign to a view model field, etc. 
} 

、あなたは、例えば、イベントハンドラをサブスクライブしますがページのコンストラクターまたはXAMLに挿入します。たとえば:

public partial class Page2 : Page 
{ 
    public Page2() 
    { 
     InitializeComponent(); 

     NavigationService.LoadCompleted += NavigationService_LoadCompleted; 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     NavigationService.GoBack(); 
    } 

    private void NavigationService_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
     string str = (string)e.ExtraData; 

     // do whatever with str, like assign to a view model field, etc. 
    } 
} 
+0

あなたはイベントハンドラの購読についてもっと詳しく説明できます。この言語でコーディングすると少し初心者です – syn3rgy

+0

コンストラクタを購読するなど、上記の編集を参照してください。それは正常に動作するはずですが、その時点で 'NavigationService'が' null'であることが分かった場合、 'Page.Loaded'イベントのハンドラにコードを移さなければならないかもしれません(同様に' Loaded + = Page_Loaded'、あなたの 'Page2'クラスに' void Page_Loaded(オブジェクト送り手、RoutedEventArgs e) 'メソッドがありますが、うまくいけばそのようにする必要はありません)。 –

+0

私は上記のコードに従い、nullを得ました。あなたが再び言及したことをやったのですが、私が正しいのかどうかはわかりません。私がしたのは 'private void Page_Loaded(オブジェクト送信者、RoutedEventArgs e)'と 'NavigationService.LoadCompleted + = NavigationService_LoadCompleted;'です。そして 'public = Page2()' – syn3rgy

関連する問題