2017-02-22 7 views
2

私は依存関係プロパティはnull

<shared:NavigationControl Owner="{Binding ElementName=This, Converter={StaticResource TestConverter}}" /> 

Thisプロパティは私のページのx:NameあるOwner財産と私のユーザーコントロールを作成しました。私はバインディングがOKであり、それがあるかどうかを確認するためにTestConverterを作成している

public MvxWindowsPage Owner 
{ 
    get { return (MvxWindowsPage)GetValue(OwnerProperty); } 
    set { SetValue(OwnerProperty, value); } 
} 

public static readonly DependencyProperty OwnerProperty = 
       DependencyProperty.Register("Owner", typeof(MvxWindowsPage), typeof(NavigationControl), null); 

:ここ

は、背後にあるコードです。

なぜOwnerプロパティがnullでありますか?

+0

これはヌルではありませんか?あなたが設定している場所/方法を表示します。 – loopedcode

+0

Converterを表示することはできますか?そこに戻るのは何ですか?私は問題がコンバータ内部にあると思っています。最後に 'return value; 'がありますか? – Romasz

+0

もちろん、問題は、ウィンドウがロードされた後に値がバインドされ、私のコンストラクタ内の値を取得しようとしていて、その前のバインディングがある可能性があると思いますか? – miechooy

答えて

0

問題はおそらくThisプロパティにあります。それがヌルでないことを確認する必要があります。 PropertyChangedコールバックを追加してから、OwnerPropertyに送信された値がnullでないことをデバッグして確認します。私はこの問題を確認してきたように

public MvxWindowsPage Owner 
{ 
    get { return (MvxWindowsPage)GetValue(OwnerProperty); } 
    set { SetValue(OwnerProperty, value); } 
} 

public static readonly DependencyProperty OwnerProperty = 
       DependencyProperty.Register("Owner", typeof(MvxWindowsPage), typeof(NavigationControl), new PropertyMetadata(PropChanged)); 

public static void PropChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
     var value = e.NewValue; //confirm this isn't null 
} 
+0

e.NewValueには適切な値が含まれています; O – miechooy

0

バインディングのElementName(あなたはどこにでものDataContextを設定されていない)である、あなたのページのロードイベントで最初に利用可能であるということです。 Pageのコンストラクタで値を使用できるようにするには、以前にbindings updateを呼び出す必要があります。このプロセスを起動するのDataContextを設定して行うことができます、しかしx:Bindとの簡単な方法があります:

<local:MyUserControl x:Name="myUsrCtrl" Owner="{x:Bind This, Mode=OneWay, Converter={StaticResource MyConverter}}"/> 

[ページのコンストラクタで、あなたがこのようなバインディングアップデートをivokeことができます。

public BlankPage() 
{ 
    this.InitializeComponent(); 
    this.Bindings.Update(); 
    var aaa = myUsrCtrl.Owner; // this shouldn't be null now 
    // rest of code 

おそらくロジックを変更する方が、コンストラクタで更新を呼び出すよりも良いでしょう。

+0

よろしくお願いします。要点は、ナビゲーションバーであるこのユーザーコントロールを持っていることです。私は自分のアプリケーションのどのページでも見せたいと思っていました。ナビゲーション動作は、現在表示されているページを強調表示することです。私はこのナビゲーションバーを現在のページに置くことができると思ったので、このナビゲーションバーコントロール内のアイコンを強調表示することができました – miechooy

+2

@miechooyその後、私は別のデザインに行きます。あなたのウィンドウのコンテンツをページの下部にナビゲーションバーで表示させ、残りは残りのページを保持するフレームで埋めます。あなたのナビゲーションバーでは、 'Frame.Content'にバインドできます(必要に応じていくつかのキャスティングを行います)。 – Romasz