我在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,为什么我的第一个片段不起作用?
答案 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>