【问题标题】:Get item from custom control / C# WPF从自定义控件/ C# WPF 中获取项目
【发布时间】:2013-04-20 11:25:30
【问题描述】:

我有 2 节课:

class MultiSwitch : ListBox
{
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is MultiSwitchItem;
    }
    protected override DependencyObject GetContainerForItemOverride( )
    {
        return new MultiSwitchItem( );
    }

}

class MultiSwitchItem : ListBoxItem {...}

基本上,我想根据物品数量放置物品。所以我订阅了集合更改事件,我试图从 Items 集合中接收 MultiSwitchItem。我发现 Items 集合不包含 MultiSwitchItems。然后我找到了看起来像这样的解决方案:

    private void RearrangeItems(
        object sender,
        NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
    {
        foreach (var item in Items)
        {
            MultiSwitchItem item2 = ItemContainerGenerator.ContainerFromItem(item) as MultiSwitchItem;
            ...
        }
    }

但 item2 始终为空。我做错了什么?

编辑 好的,我在这方面取得了一些进展。此问题仅在初始化控件时出现(所以我认为,项目的包装器不是立即创建的)。所以现在的问题是:如何强制创建MultiSwitchItems,或者如何在创建包装器后迭代项目?

【问题讨论】:

  • 如果你想重新排列项目,为什么不使用 CollectionView 呢?另一种解决方案是编写自己的面板。或者,如果您坚持这样做,您可以尝试 OnLoaded 事件或 ItemContainerGenerator 事件以稍后开始重新排列。
  • @dowhilefor 我认为在我的容器中实现这个逻辑更容易......无论如何,我订阅了 Loaded 事件并且它有效!感谢您的帮助!

标签: c# wpf listbox


【解决方案1】:

而不是这个

ItemContainerGenerator.ContainerFromItem(item as TextBlock)

这样做

ItemContainerGenerator.ContainerFromItem(item)

item 不会是TextBlock,它将是基础数据项

【讨论】:

  • 不幸的是,这不是问题的根源。 (当我尝试这个控件时,我只使用了TextBlocks)
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多