2017-07-29 8 views
0

プリズムXamarinは、ビューがプリズム6.3.0 OnNavigatedTo

をモデルを変更した後に更新されていないフォームIは、ビューに移動していると私はOnNavigatedTo方法の設定モデルのいくつかのプロパティです。問題は、モデルのプロパティを設定した後にビューが更新されないことです。

私のモデルはOnNavigatedTo方法が

public void OnNavigatedTo(NavigationParameters parameters) 
{ 
    var personModel = (Persom)parameters["Model"]; 

    _model.Email = personModel.Email; 
} 

とXAML

<Entry Text="{Binding Person.Email, Mode=TwoWay}"> 
</Entry> 
である私のViewModel

public Person Model 
{ 
    get => _model; 
    set => SetProperty(ref _model, value); 
} 

でこの

public class Person 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
} 

のように見えます

また、OnNavigatingToメソッドを試しましたが、期待した結果がありませんでした。ビューに移動しているときに新しいデータでビューを更新するにはどうすればよいですか?

答えて

1

プライベート変数の代わりにセッターを使用してモデルを設定します。

public void OnNavigatedTo(NavigationParameters parameters) 
{ 
    var personModel = (Person)parameters["Model"]; 

    Model.Email = personModel.Email; 
} 

また、あなたのXAMLはModel.Email

へPerson.Emailから変更=========== EDITED ============する必要があります

SetPropertyを呼び出さないモデルの電子メールのみを設定するので、ビューは新しい電子メールセットで更新されません。ビューの更新を持つために、あなたは次のように人のモデルを設定する必要があります。

public class Person : BindableBase 
{ 
    public string Name { get; set; } 

    private string _email; 
    public string Email 
    { 
     get { return _email; } 
     set { SetProperty(ref _email, value); } 
    } 
} 

かだけではなくOnNavigatedToで電子メールを設定するには、Personオブジェクトを設定することができます。

+0

残念ながら、それは動作しません。あなたはXAMLについて正しいですが、質問をタイプしたときは間違いでした。 '_model'と' Model'の両方で試しましたが、どちらもうまくいきませんでした。私がそれを動作させるために見つけた唯一の方法は、割り当ての後に 'RaisePropertyChanged(" Model ");を呼び出すことですが、明示的にその呼び出しを行うべきではありません。あなたは何か考えていますか? – Dimitris

+0

あなたの質問にいくつかの情報がありません。私は答えを更新しました。 – lowleetak

+0

2番目のアプローチは私のために働いた(パブリックプロパティを新しいオブジェクトに設定する)私は最初のアプローチを試みなかった。どうもありがとう。 – Dimitris

1

Prism Quickstart Templatesでこれを行う方法の完全な実例を見ることができます。

あなたがする必要があるいくつかの重要なものがあります。

お使いのモデルのプロパティに直接結合が(それは率直に言って、私は私のアプリを&デモのすべてで行う何かで)行うには素晴らしいことです。ただし、モデルのプロパティに直接バインドするということは、モデルが観測可能であることを保証する必要があることを意味します(INotifyPropertyChangedを実装する)。

public class Person : BindableBase 
{ 
    private string _email; 
    public string Email 
    { 
     get => _email; 
     set => SetProperty(ref _email, value); 
    } 
} 

NOTE あなたはBindableBase、INotifyPropertyChanged、あるいは単にへのインタフェースを追加することを実装する任意の基本クラスを使用する必要はありません(あなたはこれを簡素化することができ(クイックスタート・テンプレートのような)PropertyChanged.Fodyを使用した場合クラスは動作します):

public class Person : BindableBase 
{ 
    public string Email { get; set; } 
} 

次に、渡すパラメータを受け入れるようにViewModelをセットアップする必要があります。 Prism 6.3ではいくつかのオプションがあることに注意してください。

プリズム6で始まる。3の場合、INavigationAwareは2つの新しいナビゲーションインターフェイス、INavigatingAwareINavigatedAwareの組み合わせになりました。名前のとおり、INavigatingAwareはナビゲーションが処理される直前(ナビゲーションスタックにビューがプッシュされる前)に処理され、INavigatedAwareは直前に発生したナビゲーションを処理します。その結果、INavigatingAware.OnNavigatingToを使用してモデルを更新すると、ビューがスタックにプッシュされたときに電子メールが表示されますが、INavigatedAware.OnNavigatedToを使用すると、目立つUIが更新される可能性があります。私ものViewModelのプロパティでModelのキーを持つことをここで注意すべき

public class ViewAViewModel : BindableBase, INavigatingAware 
{ 
    // This assumes you are using PropertyChanged.Fody as mentioned above 
    public Person Model { get; set; } 

    public void OnNavigatingTo(NavigationParameters parameters) 
    { 
     // Method 1: 
     Model = parameters.GetValue<Person>("Model"); 

     // Method 2: 
     if(parameters.TryGetValue<Person>("Model", out Model)) 
     { 
      // do something 
     } 

     // Method 3: 
     Model = new Person 
     { 
      Email = parameters.GetValue<string>("email"); 
     }; 
    } 
} 

:あなたは次のようにあなたのモデルを設定することについては行くかもしれない、あなたの目的のために選択した二つの方法のどちら

Modelという名前は重要ではありません。それはfoobarであり、まだ動作します。重要なことのようなキーマッチが、以下に示すことです:

_navigationService.NavigateAsync("ViewA", new NavigationParameters 
{ 
    { "foo", new Person { Email = "[email protected]" } } 
}); 

Model = parameters.GetValue<Person>("foo"); 

は、最後にあなたのビューのバインディングコンテキスト(あなたのViewModel)...あなたがオブジェクト型ではなく、プロパティ名にはないバインドされていることを確認する必要がありますプロパティ名Modelを使用してPersonモデルを参照するため、XAMLは次のようになります。

<Entry Text="{Binding Model.Email}" /> 
関連する問題