Wpf 如何从ControlTemplate检索VisualChild
我在.NET 3.5 SP1中有一个WPF应用程序,它正在使用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
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}" />