【问题标题】:Accessing child of ListBoxItem访问 ListBoxItem 的子项
【发布时间】:2010-12-05 23:03:26
【问题描述】:

我有一个带有 DataTemplate 的 ListBox,如下所示:

    <ListBox Name="listBox">
        <ListBox.ItemTemplate>
            <DataTemplate DataType="x:Type local:NumericIconDefinition">
                <Grid>
                    <ComboBox Name="IconComboBox"/>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

我想在后面的代码中获取 ComboBox 实例in order to manipulate it。我发现一篇博文解释了获取 ListBoxItem 的过程:

ListBoxItem lbi = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromIndex(IndexInListBox);

但我找不到访问该项目中的 Grid 和 ComboBox 实例的好方法。理想情况下,基于上面的代码,我想做这样的事情:

ComboBox cb = (ComboBox)lbi.GetChildByName("IconComboBox");

【问题讨论】:

    标签: c# wpf combobox listbox listboxitem


    【解决方案1】:

    您可以通过模板的 FindName 方法访问它:

    ComboBox cb = (ComboBox)listBox.ItemTemplate.FindName("IconComboBox", lbi);
    

    请注意,您只能在 ListBoxItem 完全加载后才能这样做,否则模板将不会被实例化

    【讨论】:

    • 我收到错误“此操作仅对应用了此模板的元素有效。”,lbi.IsInitialized 和 lbi.isLoaded 都报告为 true。错误消息是由您警告我的模板实例化问题引起的吗?如何确保它已加载?
    • 好的,实际上它不是您必须传递给 FindName 方法的 ListBoxItem,而是呈现数据的 ContentPresenter。您可以在 FindName 方法的 MSDN 页面上找到示例:msdn.microsoft.com/en-us/library/…
    • 是的,我在下午谷歌搜索更多信息时发现了这一点。我在工作中有一个简短的代码 sn-p,我计划明天在这里发布。至少要保留这个问题作为个人参考。
    • Mizipzor,老鼠和男人最好的计划往往会出错。我很想看看你计划发布的 sn-p。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多