2016-06-16 17 views
0

私は以下のContentpage.contentを持っています。ここでは特定のバインディングコンテキストを設定しています。 Post.xaml.cs(ContentView)で ContentPageからContentPageのBindingContextを取得する方法は?

<StackLayout> 
    <local:Post /> 
    <local:Comments /> 
</StackLayout> 

は、私がこのようContentPageのバインディングコンテキストを取得しようとしたが、それは動作しません。

BindingContext = (PostViewModel)Parent.BindingContext; 

私がContentViewに立っている場合、どのようにContentPageのバインディングコンテキストを取得できますか?

答えて

0

ContentViewBindingContextは、親から受け継がれているため、通常はのBindingContextです。

親をすでに設定している場合は、ContentView.BindingContextを設定する必要はありません。ContentPage.BindingContext

何かが見つからない場合は、私にお知らせください。

+0

たとえば、 'var ViewModel =(PostViewModel)BindingContext;'を設定すると、ViewModelはNullになります。それで、うまくいきません。 @ hvaughan3 –

+1

@FedeBercoそうでなければ、 'ContentView'が初期化されるとき、親' ContentPage.BindingContext'はおそらく 'null'です。 'ContentPage'の' BindingContext'を設定することを心配する必要はなく、コントロールをバインドする必要があるだけです.ContentPageの 'BindingContext'が最終的に取得すると、コントロールに値が書き込まれるためですセット。 – hvaughan3

+0

私はあなたの言うことを理解していますが、ContentViewのコンストラクタでBindingContextのViewModelを使用して、特定の条件に基づいてアイテムを表示および非表示にする必要があります。私はInitializeComponent();の前にBindingContextを設定しようとしました。それはまだ動作しません。私は明確でしたか? @ hvaughan3 –

4

コンストラクタが呼び出されるまでには、BindingContextはまだ初期化されていない可能性があります。

したがって、操作を実行するにはBindingContextが変更されるまで待つ必要があります。

私は答えがOnBindingContextChangedイベントだと思います。 https://developer.xamarin.com/api/member/Xamarin.Forms.View.OnBindingContextChanged()

リトルサンプル:

 protected override void OnBindingContextChanged() 
     { 
      base.OnBindingContextChanged(); 

      //BindingContext should not be null at this point 
      // and you may add your code here. 
     } 

注: お持ちの場合はContentPage内部ContentView、明示的またはあなたのコードで(ListViewコントロールのためのItemTemplateにを使用しているときのように)別のコントロールで設定されていない限り、 ContentViewのBindingContextはContentPageと同じです。

したがって、「親」を呼び出す必要はありません。

もっと明確にする必要がある場合はお知らせください。

+0

thx、良い答え、さらに、コンストラクタ内の親のbindingcontextを設定することがわかりましたonappearringではなく、このアプローチを取ったときのパフォーマンスにも役立ちます – Mike

関連する問題