簡體   English   中英

WPF 中的 NameScope 是如何工作的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM