[英]How does NameScope in WPF work?
我在 WPF 中的 NameScopes 有一個奇怪的行為,我創建了一個名為 FadingPopup 的 CustomControl,它是 Window 的子類,內部沒有什么特別的。
<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 中注冊自己。 但是,綁定似乎嘗試使用 FadingPopup 的 NameScope(為空)解析 ElementName,因此綁定不起作用......
如果我在我的類 FadingPopup 中指定 NameScope ,我的第一個片段效果很好:
static FadingPopup()
{
NameScope.NameScopeProperty.OverrideMetadata(typeof(FadingPopup), new PropertyMetadata(new NameScope()));
}
但是我不喜歡這個解決方案,因為我不明白為什么在第一個片段中,prec 是在 Window 的 NameScope 中注冊的,而 ElementName 是使用 FadingGroup 的 NameScope 解析的(默認情況下為 null)...
有人可以向我解釋發生了什么嗎? 為什么我的第一個片段不起作用,如果我沒有為 FadingGroup 指定默認的 NameScope ?
如何:定義名稱范圍 Microsoft Docs提供了對此事的后代解釋。
你應該檢查你的控件上的 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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.