WPF中的NameScope如何工作?

时间:2009-04-28 23:50:29

标签: .net wpf

我在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中注册自己。 但是,似乎Binding尝试使用FadingPopup的NameScope(为空)来解析ElementName,因此绑定不起作用...

如果我在班级FadingPopup中指定了NameScope,我的第一个剪辑效果很好:

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

但是我不喜欢这个解决方案,因为我不明白为什么在第一个片段中,prec在NameScope of Window中注册,但是ElementName是用FadingGroup的NameScope解析的(默认情况下为null)。 ..

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

1 个答案:

答案 0 :(得分:-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>