当前位置:  开发笔记 > 编程语言 > 正文

使用Grid作为ItemsPanelTemplate的ListBox会产生奇怪的绑定错误

如何解决《使用Grid作为ItemsPanelTemplate的ListBox会产生奇怪的绑定错误》经验,为你挑选了4个好方法。

我有一个ListBox控件,我在网格布局中呈现固定数量的ListBoxItem对象.所以我将ItemsPanelTemplate设置为Grid.

我从后面的代码访问Grid以配置RowDefinitions和ColumnDefinitions.

到目前为止,它都像我期望的那样工作.我有一些自定义的IValueConverter实现,用于返回每个ListBoxItem应该出现的Grid.Row和Grid.Column.

但是我有时会遇到奇怪的绑定错误,我无法弄清楚它们为什么会发生,或者即使它们在我的代码中.

这是我得到的错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ListBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')

谁能解释一下发生了什么?

哦,这是我的XAML:


    
    
    
    
    

            



    
        
            
            
        

        
            
        

        
            
                
                    
                        
                            
                                                    
                    
                
            
        
    



1> ligaz..:

绑定问题来自ListBoxItem的默认样式.默认情况下,将样式应用于元素时,WPF会查找默认样式,并应用默认样式中未在自定义样式中专门设置的每个属性.有关此行为的更多详细信息,请参阅Ian Griffiths撰写的这篇精彩博文.

回到我们的问题.这是ListBoxItem的默认样式:


请注意,我已经删除了ControlTemplate以使其紧凑(我使用了StyleSnooper - 来检索样式).您可以看到存在一个绑定,其相对源设置为具有ItemsControl类型的祖先.因此,在您的情况下,绑定时创建的ListBoxItems找不到它们的ItemsControl.你能提供更多关于ListBox的ItemsSource的信息吗?

PS:删除错误的一种方法是在自定义样式中为Horizo​​ntalContentAlignment和VerticalContentAlignment创建新的setter.


另外,在我的自定义样式中使用Horizo​​ntalContentAlignment的setter,似乎对我没什么影响(这是为了ComboBoxItem).
+1指向Ian Griffith的帖子.这是关于如何构造元素的最佳描述之一......这是我读过的.

2> 小智..:

设置OverridesDefaultStyleTrue你的ItemContainerStyle意志也解决这些问题.




3> David Schmit..:

这是一个常见的问题与ListBoxItemS和其他短暂的*Item容器.在ItemsControl加载/渲染时,它们是异步/动态创建的.你必须重视ListBox.ItemContainerGeneratorStatusChanged事件和等待状态成为ItemsGenerated试图访问之前.



4> Chris..:

这是其他答案的混合,但对我来说,我必须应用Setter两个地方来解决错误,尽管这是在使用自定义时VirtualizingWrapPanel

如果我删除以下任一Setter声明之一,我的错误就会重新出现.

        
            
                
            
            
                
            
            
                
                    
                
            
        

我现在没有时间进一步调查,但我怀疑这与JTango在他的回答中提到的默认风格有关 - 我不是真的在很大程度上定制我的模板.

我认为其他答案还有更多的里程,但我想我会发布这个有机会帮助同一条船的人.

David Schmitt的回答看起来可能描述了根本原因.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有