none
通过数据绑定的tabControl如何获取某个tabItem? RRS feed

  • 问题

  •         <TabControl Name="tabControl">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding SubFunctionName}"/>
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                    <DataTemplate>
                        <Grid Background="WhiteSmoke">
                        </Grid>
                    </DataTemplate>
                </TabControl.ContentTemplate>
            </TabControl>

    tabControl.Items[0] 的类型不是TabItem而是tabControl.ItemSource的类型,求问如何获取tabControl的某个TabItem?
    2013年2月22日 10:02

答案

全部回复

  • 可以这样:

    TabItem ti = tabControl.ItemContainerGenerator.ContainerFromIndex(0) as TabItem;

    你也可以ContainerFromItem。

    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年2月25日 9:14
    版主
  • 您好,如果我要进一步的获取模板中的Grid控件,我需要在等待tabControl.ItemContainerGenerator.StatusChanged和tabItem.Loaded两个事件后才能获取到?

    我改一下代码,如下:

            <TabControl Name="tabControl">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding SubFunctionName}"/>
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                    <DataTemplate>
                        <Grid Background="WhiteSmoke">
                            <TextBlock Name="myTextBlock"/>
                        </Grid>
                    </DataTemplate>
                </TabControl.ContentTemplate>
            </TabControl>

    比如我想获取myTextBlock控件,

    我先通过TabItem ti = tabControl.ItemContainerGenerator.ContainerFromIndex(0) as TabItem获取到tabItem

    我发现ti的VisualTreeHelper.GetChildrenCount(ti)=1;这个子控件是Grid,Grid的子控件也只有个,是Border。

    通过网络的求助,我尝试了几种办法,都无法获取到TextBlock。

    求问如何获取到?

    版本是.Net3.5SP1

    2013年2月26日 4:22
  • 我觉得你的第二个问题是一个新的问题, 我建议你开个新的帖子 下一次,尽量保证一个帖子一个问题。

    你可以这样获得TextBlcok:

    ContentPresenter cp = tabControl.Template.FindName("PART_SelectedContentHost", tabControl) as ContentPresenter;
    TextBlock tb = tabControl.ContentTemplate.FindName("myTextBlock",cp) as TextBlock;


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年2月26日 5:43
    版主
  • 我觉得你的第二个问题是一个新的问题, 我建议你开个新的帖子 下一次,尽量保证一个帖子一个问题。

    你可以这样获得TextBlcok:

    ContentPresenter cp = tabControl.Template.FindName("PART_SelectedContentHost", tabControl) as ContentPresenter;
    TextBlock tb = tabControl.ContentTemplate.FindName("myTextBlock",cp) as TextBlock;


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    貌似有点问题,
    i)PART_SelectedContentHost 这个是什么?

    ii)因为tabControl下有多余1个tabItem,如何区别每一个tabItem的TextBlock?

    谢谢答复

    2013年2月26日 14:05
  • 1, 那个是tabcontrol模板里面host content的东西,你的contenttemplate就是用这这上面,所以通过这个可以找到textblock

    2,如何区别在这里是没有意义的,因为你定义的是一个datatemplate,这个东西就是在每一个item都用这个template,既然都用同一个,你为何还要区分。另外,tabcontrol只显示选中的那个item作为content。


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年2月27日 4:26
    版主
  • 谢谢您的回答

    2013年2月28日 10:05