2009-04-28 7 views
3

WPF에서 NameScopes와 함께 이상한 동작이 발생했습니다. FadingPopup이라는 CustomControl을 만들었습니다.이 클래스는 특별한 내부 구조가없는 Window의 하위 클래스입니다.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을 해결하려고 시도하므로 바인딩이 작동하지 않는 것 같습니다.

내 NameScope를 지정하면 잘됩니다. 클래스 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

죄송합니다, 그것은 (새 PropertyMetadata (새 NameScope())) 대해서 typeof (FadingPopup) 은 내가 설명을 찾을 생각하지 않는다 :(완전히 잊고 6 년이, 그냥 NameScope.NameScopeProperty.OverrideMetadata을 사용하고있다 ; –

답변

-2

컨트롤에서 DataContext를 확인하고 이와 같이하면 좋을 것입니다. 경로를 추가해야 할 수도 있지만 그렇지 않을 수도 있습니다.

<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

그것은 작동하지 않는다. 우리가 ElementName을 지정하지 않았을 때 DataContext가 사용된다. 그리고 ElementName을 사용하지 않더라도 DataContext가 {Binding}으로 설정해야하는 이유를 이해할 수 없다. 논리적 인 부모 (또는 시각적 인 부모, 나는 확실하지 않다)로부터 자동으로 물려 받았다. –

관련 문제