我在 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 在资源中,它会在窗口的 NameScope 中注册自己。 但是,Binding 似乎试图用 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/