编辑:在阅读那篇文章时,我发现这很有趣:
“因此,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关.”
如果这是真的,那是不是意味着Binding ElementName根本不适用于模板?但是我的模板中的ElementName肯定有一些工作绑定.这是最令人困惑的部分,为什么一些绑定在模板中随机工作而其他绑定没有?它必须有一些尝试解析名称的方法,即使它不在模板或同一个名称范围内
解决方法
我已经和WPF一起工作了足够长的时间来猜测我什么时候会遇到问题并且我知道常见的区域,但是不要认为在所有情况下都可以轻松地告诉我.
if this is true,doesn’t that mean that Binding ElementName should not work in templates at all? But then I definitely have some working bindings on ElementName within my templates.
内部就好了,这是相同的范围.这里的要点是,如果您应用模板并且它们没有自己的范围,则会发生冲突.
例如
<Button/> <Button/>
如果我们扩展ControlTemplate你会得到类似的东西:
<Border Name="bd" Background="{TemplateBinding Background}">...</Border> <Border Name="bd" Background="{TemplateBinding Background}">...</Border>
显然我们会得到名称冲突.
如果您在模板中命名控件名称将与其他项目的应用模板中的同一控件实例冲突,则对于ItemsControls中的DataTemplates也是如此.
另一方面,您可以从模板内部绑定到外部,因为逻辑上只有一个具有该名称的实例,或者您可以根据名称范围的“关闭”方式为它们提供不同的优先级,例如:
<TextBox Name="tb" Text="Test"/> <ItemsControl ItemsSource="ABC"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Text,ElementName=tb}"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
原文地址:https://www.jb51.cc/csharp/96970.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。