Silverlight 获取DataTemplate 中可视化元素
在Silverlight开发项目中经常遇到的一种情况是将一个数据集合绑定到Silverlight的集合控件上,例如ItemsControl,ListBox,DataGrid等。
为了更好的对这些数据进行可视化的交互,我们经常的做法是写一个ItemTemplate,但是写到了ItemTemplate中的一些控件(Grid, TextBlock...尤其是操作一些自定义的控件)如何再通过程序访问就是这次讨论的问题(其实也不是什么复杂的问题,呵呵)
例如下面:我有一个自定义的Control叫做AniItem,我希望用这个Control和一些其他的控件(Border)共同显示一个Item项。然后在MouseEnter的时候做一些事情(当然也可以用委托代理做这件事,这里只是讨论如何获取此控件)。
<ItemsControl X:Name="SlidesContainer" ItemsSource="{Binding RoleSlidesCollection}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<local:AniItem MouseEnter="AniItem_MouseEnter"
DataContext="{Binding}"
Title1="{Binding TitleA}"
Title2="{Binding TitleB}"
ImgPath="{Binding ImageUrl}"
ImgHeight="{Binding ImageHeight}"
ImgWidth="{Binding ImageWidth}">
</local:AniItem>
<Border Grid.Column="1" Style="{StaticResource SplitBorder}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
以上完成了基础性代码,接下来实现获取Template中的AniItem:
for (int i = 0; i < this.SlidesContainer.Items.Count; i++)
{
//获取ItemTemplate中Control的根元素(Grid)
var item = this.SlidesContainer.ItemContainerGenerator.ContainerFromIndex(i);
//这样得到了Grid之后就很容易拿到AniItem了吧~~
var target = (item as Panel).Children.FirstOrDefault(c=>c is AniItem);
//之后就可以随心所欲了 哈哈
target.DoWork();
}