从自定义控件/C#WPF获取项目
我有两门课:从自定义控件/C#WPF获取项目,c#,wpf,listbox,C#,Wpf,Listbox,我有两门课: class MultiSwitch : ListBox { protected override bool IsItemItsOwnContainerOverride(object item) { return item is MultiSwitchItem; } protected override DependencyObject GetContainerForItemOverride( ) { retur
class MultiSwitch : ListBox
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is MultiSwitchItem;
}
protected override DependencyObject GetContainerForItemOverride( )
{
return new MultiSwitchItem( );
}
}
class MultiSwitchItem : ListBoxItem {...}
基本上,我想根据项目数量放置项目。所以我订阅了collection changed事件,并尝试从Items集合接收MultiSwitchItem。我发现Items集合不包含MultiSwitchItems。然后我找到了如下解决方案:
private void RearrangeItems(
object sender,
NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
{
foreach (var item in Items)
{
MultiSwitchItem item2 = ItemContainerGenerator.ContainerFromItem(item) as MultiSwitchItem;
...
}
}
但是item2总是空的。我做错了什么
编辑
好的,我在这方面有一点进展。这个问题只有在控件初始化时才会出现(所以我认为,不会立即创建项的包装器)。现在的问题是:如何强制创建MultiSwitchItem
s,或者在创建包装器后如何迭代项?而不是此
ItemContainerGenerator.ContainerFromItem(item as TextBlock)
这样做
ItemContainerGenerator.ContainerFromItem(item)
项不会是
文本块
,它将是底层数据项,不幸的是,这不是问题的根源。(当我尝试此控件时,我只使用了TextBlock
s)如果要重新排列项目,为什么不使用CollectionView?另一个解决方案是编写自己的面板。或者,如果您坚持这样做,您可以尝试使用onload事件或ItemContainerGenerator事件,以便稍后开始重新排列。@Dowhile我认为在我的容器中实现此逻辑更容易。。。无论如何,我订阅了加载的事件,它可以工作!谢谢你的帮助!