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