Son*_*Boy 33 wpf containers listbox itemssource
我有一些奇怪的行为,我似乎无法解决.当我遍历ListBox.ItemsSource属性中的项目时,我似乎无法获取容器?我期待看到一个ListBoxItem返回,但我只得到null.
有任何想法吗?
这是我正在使用的一些代码:
this.lstResults.ItemsSource.ForEach(t =>
{
ListBoxItem lbi = this.lstResults.ItemContainerGenerator.ContainerFromItem(t) as ListBoxItem;
if (lbi != null)
{
this.AddToolTip(lbi);
}
});
Run Code Online (Sandbox Code Playgroud)
ItemsSource当前设置为Dictionary并且包含许多KVP.
Phr*_*ert 50
在这个StackOverflow问题中,我发现了一些对我的案例更有效的东西:
通过在调用ContainerFromItem或ContainerFromIndex之前放入UpdateLayout和ScrollIntoView调用,可以实现DataGrid的那部分,这使得它可以返回ContainerFromItem/ContainerFromIndex的值:
dataGrid.UpdateLayout();
dataGrid.ScrollIntoView(dataGrid.Items[index]);
var row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index);
Run Code Online (Sandbox Code Playgroud)
如果您不希望DataGrid中的当前位置发生变化,这对您来说可能不是一个好的解决方案,但如果可以,则无需关闭虚拟化即可运行.
Son*_*Boy 15
最后解决了问题...通过添加VirtualizingStackPanel.IsVirtualizing="False"到我的XAML,现在一切都按预期工作.
在缺点方面,我错过了虚拟化的所有性能优势,因此我将负载路由更改为异步,并在加载时将"微调器"添加到我的列表框中...
object viewItem = list.ItemContainerGenerator.ContainerFromItem(item);
if (viewItem == null)
{
list.UpdateLayout();
viewItem = list.ItemContainerGenerator.ContainerFromItem(item);
Debug.Assert(viewItem != null, "list.ItemContainerGenerator.ContainerFromItem(item) is null, even after UpdateLayout");
}
Run Code Online (Sandbox Code Playgroud)
使用调试器逐步执行代码,看看是否实际上没有任何as撤销,或者如果-cast是错误的,从而将其转换为null(您可以使用普通的强制转换来获得正确的异常).
经常发生的一个问题是当a ItemsControl虚拟化大多数项目时,任何时间点都不会存在容器.
此外,我不建议直接处理项目容器,而是绑定属性和订阅事件(通过ItemsControl.ItemContainerStyle).
使用此订阅:
TheListBox.ItemContainerGenerator.StatusChanged += (sender, e) =>
{
TheListBox.Dispatcher.Invoke(() =>
{
var TheOne = TheListBox.ItemContainerGenerator.ContainerFromIndex(0);
if (TheOne != null)
// Use The One
});
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36955 次 |
| 最近记录: |