Amo*_*var 6 wpf binding relativesource findancestor
是FindAncestor搜索在窗口的整体视觉树中的元素?
如果是,那么我该如何改进呢?
是binding data error,如果我们通过寻找与查找祖先与没有这样的元素存在的元素来访问对象的属性抛出?
如果是,那么我该如何解决这样的错误.
在我的情况下绑定错误抛出输出窗口.为了解决这个错误,我尝试了设置FallbackValue,但现在它给了我警告而不是错误,这是唯一的区别.其他一切都和错误一样.
谁能告诉我究竟是如何FindAncestor运作的?
如果你想了解FindAncestor内部是如何工作的,你应该阅读内部代码。http://referencesource.microsoft.com/#PresentationFramework/Framework/MS/Internal/Data/ObjectRef.cs,6a2d9d6630cad93d
你应该尝试不要使用 FindAncestor那么多。它可能会很慢,而且孩子们不应该依赖“在某个地方存在一个父母拥有我需要的东西”的知识。
也就是说,FindAncestor它本身有时也可以成为你的朋友。
这取决于您的情况,但例如,通常使用DataGridRowwhichFindAncestor来查找有关DataGrid父元素或某些其他父元素的信息。
问题是:速度超级慢。假设您有 1000 个 DataGridRow,每行都使用FindAncestor,再加上每行有 7 列,其本身必须遍历逻辑树中的约 200 个元素。它不必很慢,DataGridRow始终具有相同的父级DataGrid,它可以轻松缓存。也许“一次性缓存的relativeSources”将是新概念。
这个概念可以是这样的:像您所做的那样编写您自己的relativeSource 绑定。第一次完成绑定后,使用可视树助手查找特定类型的父级。如果完成,您可以将找到的父级存储在直接父级 Attachewd 属性中,如下所示:
var dic = myElementThatUsesRelativeSourceBinding.Parent.
GetCurrentValue(MyCachedRelativeSourceParentsProperty)
as Dictionary<Type, UIElement>;
dic[foundType] = actualValue;
Run Code Online (Sandbox Code Playgroud)
稍后,您将在稍后搜索相关源时使用此缓存信息。对于父元素/父元素的相同元素/子元素,它不会采用 O(n),而是采用 O(1)。
如果您知道父级始终存在,则应该在代码隐藏中为每个尝试使用FindAncestor. 这样你就可以避免遍历树。
您还可以创建一个混合解决方案,跟踪可视化树的变化,并维护“缓存”。如果 aDataGridRow要求“在类型之外查找我的相对源DataGrid”,则没有理由需要一直这样做:您可以缓存它。有OnVisualChildrenChanged- 只是一个想法,甚至不能 100% 确定它是否可以很好地完成,但这将需要额外的内存和字典。
不用说,这可能会变得非常复杂:-),但对于“业余项目”来说会很酷。
另一边;你还应该展平视觉树,它会提高你的速度。
| 归档时间: |
|
| 查看次数: |
1377 次 |
| 最近记录: |