Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何从ControlTemplate检索VisualChild_Wpf_Wpf Controls - Fatal编程技术网

Wpf 如何从ControlTemplate检索VisualChild

Wpf 如何从ControlTemplate检索VisualChild,wpf,wpf-controls,Wpf,Wpf Controls,我在.NET 3.5 SP1中有一个WPF应用程序,它正在使用TabControl 因为我们有选项卡项,它们又有样式来确定当前显示的项。 假设我们有一个名为Books的TabItem,现在Books将有三个显示阶段: 1.加载结果, 2.显示结果, 3.未显示结果-即未找到任何结果 <TabControl> <TabItem Header="Books"/> <TabItem Header="DVD's"/> ... </TavC

我在.NET 3.5 SP1中有一个WPF应用程序,它正在使用
TabControl

因为我们有
选项卡项
,它们又有
样式
来确定当前显示的项。
假设我们有一个名为Books的
TabItem
,现在Books将有三个显示阶段:
1.加载结果,
2.显示结果,
3.未显示结果-即未找到任何结果

<TabControl>
    <TabItem Header="Books"/>
    <TabItem Header="DVD's"/>
    ...
</TavControl>
选项卡项下
我有一个
文本块
来显示当前找到的结果数:

<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>  
这样,每次用户选择不同的选项卡时,“我的文本块”的内容都会发生变化。

P.S.然而,如果没有对两个答案进行评估,我是不会这样做的。

在WPF中,我们通常使用数据元素而不是UI元素。我的意思是,通常将我们的代码隐藏或视图模型中的数据元素绑定到视图、

UserControl
s和
Window
s中的UI元素

因此,如果在代码隐藏或视图模型中有一个名为
Books
的数据集合属性,那么您可以简单地引用该集合以了解其中有多少项,而不是尝试通过UI控件查找:

<ListView ItemsSource="{Binding Books}" />

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

为集合类定义数据模板

乙二醇


xaml


或者,如果您没有单独的集合,则使用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>

然后,获取所选选项卡的项目数的绑定将

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


我建议采用数据绑定方式。其次,要获取项目数量,可以使用TabControl上的
项目计数。ItemsSource.Count仅在items源上有Count属性时有效,例如IEnumarable没有任何属性。感谢您的快速响应,但是当我使用
TabControl.items.Count时,
我得到的是TabItems的数量,而不是从DB返回的结果的数量。您想要图书的数量吗?也许绑定到
{binding Books.Count}
可以帮助您获得所需的。我的问题是关于当前选择的选项卡,所以是当前的图书数量,所以用户首先查看图书,但当用户更改为漫画时,需要显示当前的漫画数量,而不是图书数量。希望这是有意义的。确实有意义,但在这种情况下,你需要重新构造你的代码。谢谢,顺便说一句:我在我的应用程序中使用MVVM Light,我应该首先指定它。这在这里不会有任何区别。很好,我现在将评估两个答案,并选择一个在我看来做得最好的答案,job。很棒的发现@XAMlMAX!ListView或任何ItemsControl还允许您使用items属性计算绑定项的数量。最后但并非最不重要的一点是,快乐编码:)
public ObservableCollection<Book> Books
{
    get { return books; }
    set 
    { 
        books = value; 
        NotifyPropertyChanged("Books"); 
        NotifyPropertyChanged("BookCount");
    }
}

public int BookCount
{
    get { return Books.Count; }
}
// Finding the grid that is generated by the ControlTemplate of the Button
Grid gridInTemplate = (Grid)myButton1.Template.FindName("grid", myButton1);

// Do something to the ControlTemplate-generated grid
MessageBox.Show("The actual width of the grid in the ControlTemplate: "
    + gridInTemplate.GetValue(Grid.ActualWidthProperty).ToString());
<DataTemplate DataType="{x:Type l:BookCollection}">
    <ListView ItemsSource="{Binding}" />
</DataTemplate>
<TabControl x:Name="Tc">
    <TabItem Header="Books"
             Content="{Binding Books}" />
    <TabItem Header="DVD's"
             Content="{Binding DVDs}" />
</TabControl>
<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>
<TextBlock Text="{Binding SelectedItem.Content.Count, ElementName=Tc}" />