2017-07-26 3 views
-1

ページ間でデータを転送し、バインディングを行う必要があります。 最初のページには、テキストボックスが「ユーザー名」プロパティにバインドされています。 すべてのページは、私がテキストブロックユーザー名プロパティにバインドされている2ページ目には、このWPFページ間のバインド/ビューモデル間でのデータの転送

SecondPageViewModel.Username = this.Username; 

ような何かをやった最初のページにあるボタンをクリックした後、独自ののviewmodelを持っていますが、ページの変更後に、2ページ目のショーテキストなし。

<TextBlock Text="{Binding Username}" /> 

私が発見し、作品の唯一の方法は、コンストラクタ内の第2ページのviewmodel内にあるユーザ名を更新したタスクを行います。

Task.Run(async() => 
{ 
    while(true) 
    { 
     await Task.Delay(200); 
     this.Username = FirstPageViewModel.Username; 
    } 
}); 

他の方法がありますか?ここでの作業を行うことで、いつも動いているとは限りません。ページが速すぎると、ユーザー名が表示されないことがあります。

すべてのviewmodelは、INotifyPropertyChanged + FodyWeaverを実装しています。

+0

SecondPageViewModel.Usernameが宣言されてどのように? –

+0

あなたは、メッセージング間のビューモデルを経由する必要があります。 https://marcominerva.wordpress.com/2014/06/25/how-to-send-string-and-content-messages-with-mvvm-light-messenger/ – GCamel

+0

public staticユーザー名{get;セット} = "";両方のビューモデルで – Minorsonek

答えて

0

私のコメントに続いて、イベントを使用した簡単な実装をいくつか紹介します。

  • 最初の実装はFirstPageViewModel is parent of SecondPageViewModelです。イベントサブスクリプションはSecondPageViewModelコンストラクタで確認できます。
  • 第2の実施態様は、FirstPageViewModel is on the same level of SecondPageViewModelである。これは、2つのViewModel間にMediatorを使用します。基本的にはFirstPageViewModelの依存関係を取り除いていますSecondPageViewModel
  • 3つ目は、SecondPageViewModelにサブスクライブするFirstPageViewModelに独自の代理人を作成することです。基本的にはPropertyChangedと同じですが、どのイベント引数を渡す準備ができているかを設定できます。

ここでデモです:

public delegate void UsernameChangedEventHandler(string username); 

public class FirstPageViewModel : INotifyPropertyChanged 
{ 
    // 3) Third implementation 
    public event UsernameChangedEventHandler UsernameChanged; 

    private string _username; 
    public string UserName 
    { 
     get { return _username; } 
     set 
     { 
      _username = value; 

      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("UserName")); 

      if (UsernameChanged != null) 
       UsernameChanged(this.UserName); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class SecondPageViewModel : INotifyPropertyChanged 
{ 

    private string _username; 
    public string UserName 
    { 
     get { return _username; } 
     set 
     { 
      _username = value; 

      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("UserName")); 
     } 
    } 

    public SecondPageViewModel() 
    { 
    } 

    public SecondPageViewModel(FirstPageViewModel parent) 
    { 
     // 1) First implementation 
     parent.PropertyChanged += FirstPageViewModel_OnPropertyChanged; 

     // 3) Third Implementation 
     parent.UsernameChanged += Parent_UsernameChanged; 
    } 

    private void Parent_UsernameChanged(string username) 
    { 
     this.UserName = username; 
    } 

    private void FirstPageViewModel_OnPropertyChanged(object sender, PropertyChangedEventArgs args) 
    { 
     FirstPageViewModel parent = (FirstPageViewModel) sender; 
     if(args.PropertyName.Equals("username", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      this.UserName = parent.UserName; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class ParentViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private FirstPageViewModel _firstPageViewModel; 
    private SecondPageViewModel _secondPageViewModel; 

    public ParentViewModel() 
    { 
     // 2) Second implementation 
     _firstPageViewModel = new FirstPageViewModel(); 
     _secondPageViewModel = new SecondPageViewModel(); 

     _firstPageViewModel.PropertyChanged += FirstPageViewModel_PropertyChanged; 


     // 3) Third Implementation 
     _firstPageViewModel.UsernameChanged += FirstPageViewModel_UsernameChanged; 
    } 

    private void FirstPageViewModel_UsernameChanged(string username) 
    { 
     _secondPageViewModel.UserName = username; 
    } 

    private void FirstPageViewModel_PropertyChanged(object sender, PropertyChangedEventArgs args) 
    { 
     FirstPageViewModel firstPageViewModel = (FirstPageViewModel)sender; 
     if (args.PropertyName.Equals("username", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      _secondPageViewModel.UserName = firstPageViewModel.UserName; 
     } 
    } 
}