我在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>

在此代码段中,绑定(bind)无效(始终为空)。如果我将这些按钮从资源中移到窗口的内容中,如下所示:
<Window ...>
    <Button Name="prec" Content="ahah"></Button>
    <Button Content="{Binding ElementName=prec, Path=Content}"></Button>
</Window>

绑定(bind)按预期方式工作。

现在,我尝试将这两个代码段混合使用:
<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在资源中,则它将自己注册到Window的NameScope中。
但是,似乎绑定(bind)试图使用FadingPopup的NameScope(为null)解析ElementName,因此绑定(bind)不起作用...

如果在我的类FadingPopup中指定一个NameScope,我的第一个片段会很好地工作:
static FadingPopup()
{
    NameScope.NameScopeProperty.OverrideMetadata(typeof(FadingPopup), new PropertyMetadata(new NameScope()));
}

但是我不喜欢这种解决方案,因为我不明白为什么在第一个代码段中,prec在Window的NameScope中注册,而ElementName是使用FadingGroup的NameScope解析的(默认为null)...

有人可以向我解释发生了什么吗?如果我没有为FadingGroup指定默认的NameScope,为什么第一个代码段不起作用?

最佳答案

您应该检查控件上的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>

关于.net - WPF中的NameScope如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/800317/

10-10 10:58