wpf - 如何从 ControlTemplate 检索 VisualChild

标签 wpf wpf-controls

我有一个 .NET 3.5 SP1 中的 WPF 应用程序,它使用 TabControl
其中我们有 TabItems,而 TabItems 又具有其 Styles 来确定当前显示的项目。
假设我们有一个名为 BooksTabItem,现在 Books 将具有三个显示阶段:
1. 加载结果,
2. 显示结果,
3. 未显示任何结果 - 即未找到任何内容。

<TabControl>
    <TabItem Header="Books"/>
    <TabItem Header="DVD's"/>
    ...
</TavControl>

现在我有 5 个 TabItems,可以说它们代表“DVD”、“蓝光”、“CD”、“书籍”和“漫画”。

<TabItem Header="Books">
    <Control>
        <Control.Resources>
            <Style TargetType="Control">
               <Setter Property="Template">
                   <Setter.Value>
                       <ControlTemplate TargetType="Control">
                           <ListView ItemsSource="{Binding Books}"/>
                       </ControlTemplate>
                   </Setter.Value>
               </Setter>
            <Style.Triggers>
                <!-- Assign different Visuals depending on the current state of the app, i.e. Loading, No results, results found
                <DataTrigger .../>
            </Style.Triggers>
            </Style>
        </Control.Resources>
    </Control>
</TabItem>

TabItem下面,我有一个TextBlock来显示当前找到的结果的数量:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="Displaying {0} records for your Shop ({1})" Converter="{StaticResource tstMVC}">
            <Binding ElementName="Tc" Path="SelectedValue"/>
            <Binding Path="ShopId" FallbackValue="Liverpool"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>  

转换器可供我检查 MultiBinding 中传递的值。
问题:
用户选择选项卡项目时,我想显示所显示项目的当前数量,但我无法在中找到ListView >Control,因为这是 TabItem 的当前内容。
我已经尝试过 TabControl.SelectedItem、SelectedValue 但仍然找不到 Current ItemsSource.Count。
提前致谢


更新:
我已经尝试了这两种解决方案,非常感谢@Sheridan 和@pushpraj!
不幸的是,我没有使用它们中的任何一个,而是在 TabItem 内部使用 ListView,然后使用以下代码访问它:

<TabControl Name="Tc">
    <TabItem><ListView ItemsSource="{Binding Books}"/></TabItem>
    ...
</TabControl>

<TextBlock Text="{Binding ElementName=Tc, Path=SelectedItem.Content.Items.Count}"/>

这样,每次用户选择不同的选项卡时,我的 TextBlock 的内容都会发生变化。
P.S. 尽管如此,如果没有对这两个答案进行评估,我就不会这样做。

最佳答案

如果您的所有实体都有单独的集合类,您可以使用以下方法

为您的集合类定义数据模板

例如

<DataTemplate DataType="{x:Type l:BookCollection}">
    <ListView ItemsSource="{Binding}" />
</DataTemplate>

xaml

<TabControl x:Name="Tc">
    <TabItem Header="Books"
             Content="{Binding Books}" />
    <TabItem Header="DVD's"
             Content="{Binding DVDs}" />
</TabControl>

或者如果您没有单独的集合,则按如下方式使用 DataTemplate

<TabControl  x:Name="Tc">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <ListView ItemsSource="{Binding}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabItem Header="Books"
             Content="{Binding Books}" />
    <TabItem Header="DVD's"
             Content="{Binding DVDs}" />
</TabControl>

那么获取所选选项卡项目计数的绑定(bind)将是

<TextBlock Text="{Binding SelectedItem.Content.Count, ElementName=Tc}" />

关于wpf - 如何从 ControlTemplate 检索 VisualChild,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25844872/

相关文章:

c# - 将任何 XML 文档绑定(bind)到 WPF TreeView

WPF Richtextbox Application.Find Text 跨越多次运行

c# - 对 ObservableCollection 执行选择

当 ScrollBar 可见时,WPF ScrollViewer 显示边框

c# - WPF : Remove control's explicit foreground color

c# - 如何辨别ListBox及其ScrollBar中的鼠标事件

.net - 如何在 WPFToolkit DataGrid 的列之间创建间隙

wpf - 使 ListBox 填充父容器的宽度

C# WPF - 拖动图像

WPF 按钮内边框