2009-04-28 6 views
3

WPFでNameScopesと奇妙な動作をしています。私は何も特別なものがないWindowの子クラスであるFadingPopupというCustomControlを作成しました。WPFのNameScopeはどのように機能しますか?

<Window.Resources> 
    <local:FadingPopup> 
     <Button Name="prec" Content="ahah"></Button> 
     <Button Content="{Binding ElementName=prec, Path=Content}"></Button> 
    </local:FadingPopup> 
</Window.Resources> 

このスニペットでは、バインディングは機能しません(常に空です)。これらのボタンをリソースからウィンドウの内容に移動すると、次のようになります。

<Window ...> 
    <Button Name="prec" Content="ahah"></Button> 
    <Button Content="{Binding ElementName=prec, Path=Content}"></Button> 
</Window> 

バインディングは期待通りに機能します。それは同様に動作

<Window...> 
    <Window.Resources> 
     <local:FadingPopup> 
      <Button Name="prec" Content="Haha"></Button> 
     </local:FadingPopup> 
    </Window.Resources> 
    <Button Content="{Binding ElementName=prec, Path=Content}"></Button> 
</Window> 

今、私は、これら二つのスニペットのミックスを試してみました。

明らかに、ボタンprecがリソース内にあれば、ウィンドウのNameScopeに自身を登録します。 しかし、Bindingは、FadingPopupのNameScope(null)でElementNameを解決しようとしているため、バインディングが機能しないようです...

私の最初のスナップは、MyクラスFadingPopup:

static FadingPopup() 
{ 
    NameScope.NameScopeProperty.OverrideMetadata(typeof(FadingPopup), new PropertyMetadata(new NameScope())); 
} 

しかし、私は、なぜ、最初のスニペットで、PRECは、ウィンドウのNameScopeの登録されている理解していないので、私は、このソリューションが好きではありませんが、elementNameがFadingGroupのNameScopeの(で解決されますデフォルトではnullです)...

誰かが私に何が起こっているのか説明できますか? FadingGroupのデフォルトのNameScopeを指定しないと、最初のスニペットが機能しないのはなぜですか?

+0

x:Name = "prec"を試しましたか? – user7116

+0

これに対する解決策を見つけることができますか(自分自身を回答として投稿する可能性があります)? –

+1

申し訳ありませんが、それは完全に私が説明を見つけて、ちょうど NameScope.NameScopeProperty.OverrideMetadata(typeof演算(FadingPopup)、新しいPropertyMetadata(新しいNameScopeのを()))を使用しないと思います:( 忘れてしまった、6年が経ちました; –

答えて

-2

あなたのコントロールのDataContextをチェックしてください。このようなことをして、OKにしてください。パスを追加する必要があるかもしれませんが、恐らくそうではありません。

<Window.Resources> 
    <local:FadingPopup DataContext="{Binding}"> 
     <Button Name="prec" Content="ahah"></Button> 
     <Button Content="{Binding ElementName=prec, Path=Content}"></Button> 
    </local:FadingPopup> 
</Window.Resources> 
+1

これは機能しません.DataNameを指定しない場合はDataContextが使用され、ElementNameを使用しなかったとしても、なぜDataContextを{バインディング}に設定する必要があるのか​​理解できません。論理的な親(または視覚的な親から、私は確信していません)から自動的に継承されます。 –

関連する問題