代码之家  ›  专栏  ›  技术社区  ›  stiank81

如何在“绑定时间”获取列表框中某个项目的ListBoxItem

  •  2
  • stiank81  · 技术社区  · 14 年前

    我有一个带有foo对象的列表框,根据一些事件,我禁用/启用列表框中的列表框项。使用listbox.items属性可以找到foo对象,根据我所了解的,我需要使用以下函数来获取foo的listbox item容器。对的?

    foreach (var item in Items)
    {
        var lbi = ItemContainerGenerator.ContainerFromItem(foo) as ListBoxItem;
        // do something
    }
    

    实际上,我有一个自定义控件filteringlistbox,它继承了listbox并向它添加了一个额外的属性。上面的代码位于自定义控件的代码后面,在创建filteringListBox后工作正常。但我的问题是,当某些属性被绑定时,我会尝试这样做。我有一个属性filteringcollection和一个在绑定时触发的属性回调。在这个回调中,我将存储filtering collection,但我也将执行初始筛选-在集合中运行,并禁用表示filtering collection中的foo的任何ListBoxItem。

    这就是我遇到问题的地方。我找到了所有的foo,所以我验证了itemssource是否已设置,但是执行itemcontainerGenerator.containerFromitem时得到了空值。就像列表框项还没有创建一样。是吗?这是我的装订:

    <custom:FilteringListBox ItemsSource="{Binding AvailableFoos}" FilteringCollection="{Binding AlreadyIncludedFoos}"></custom:FilteringListBox>
    

    那么;或者:我如何在“绑定时间”上获取ListBoxItem?或者-如果我不能;是否有可以重写的事件告诉我列表框已完成创建列表框项?尝试初始化时没有运气…

    2 回复  |  直到 14 年前
        1
  •  1
  •   stiank81    14 年前

    实际上,一个更好的解决方案似乎是使用 ItemContainerGenerator . 创建时挂接事件处理程序:

    ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
    

    并使事件处理程序执行需要执行的操作:

    protected void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e)
    {
        if (ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
            EvaluateInitialElements(); 
    }
    
        2
  •  0
  •   stiank81    14 年前

    事件 OnRender 当组件准备好呈现时触发,因此创建了ListBoxItem。对这个事件进行过滤的初始处理似乎可以确保我所需要的一切都准备就绪。我计算并禁用元素,然后触发渲染:

    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
    {
        EvaluateInitialElements();
        base.OnRender(drawingContext);
    }