转自:http://www.cnblogs.com/linzheng/p/3764300.html

<Page.Resources>
<!--选中数据项的样式-->
<DataTemplate x:Key="dataTemplateSelectKey" x:Name="dataTemplateSelectName">
<Grid Tapped="StackPanel_Tap_1" Background="Red">
<TextBlock Text="{Binding LastName}" FontSize="50" />
</Grid>
</DataTemplate>
<!--默认数据项的样式,注意默认的数据项样式不能在C#中再次调用-->
<DataTemplate x:Key="dataTemplateDefaultKey" x:Name="dataTemplateDefaultName">
<StackPanel Orientation="Horizontal" Tapped ="StackPanel_Tap_1" x:Name="sp">
<TextBlock Text="{Binding LastName}"/>
<TextBlock Text=", "/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
</DataTemplate>
<!--非选中数据项的样式-->
<DataTemplate x:Key="dataTemplateNoSelectKey" x:Name="dataTemplateNoSelectName">
<StackPanel Orientation="Horizontal" Tapped ="StackPanel_Tap_1">
<TextBlock Text="{Binding LastName}"/>
<TextBlock Text=", "/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
</DataTemplate>
</Page.Resources>
<StackPanel>
<ItemsControl x:Name="listbox" ItemTemplate="{StaticResource dataTemplateDefaultKey }" ItemsSource="{Binding lstu}"/>
</StackPanel>
private void StackPanel_Tap_1(object sender, TappedRoutedEventArgs e)
{
student stu = (student)(sender as Panel).DataContext;
System.Diagnostics.Debug.WriteLine((sender as Panel).GetType().ToString());
System.Diagnostics.Debug.WriteLine(stu.LastName);
//sender是点击的item,sender as Panel获得该item内的容器对象,分别是StackPanel和Grid
// 然后从listbox里面获取到当前的ContentPresenter对象
ContentPresenter myContentPresenter = (ContentPresenter)(listbox.ContainerFromItem((sender as Panel).DataContext));
// 判断数据模板是选中状态的还是非选中状态的,然后进行赋值
if (myContentPresenter.ContentTemplate.Equals(dataTemplateSelectName))
{
//赋值非选中状态的模板
myContentPresenter.ContentTemplate = dataTemplateNoSelectName;
}
else
{
//赋值选中状态的模板
myContentPresenter.ContentTemplate = dataTemplateSelectName;
}
}

在这里还要注意一点的是,如果使用的时ListBox控件而不是ItemsControl控件的时候,在获取ContentPresenter对象的时候需要通过可视化树去查找。代码的实现如下所示:

        private void StackPanel_Tap_1(object sender, TappedRoutedEventArgs e)
{
var s=(sender as Panel).DataContext;
//System.Diagnostics.Debug.WriteLine((sender as Panel).GetType().ToString());
//System.Diagnostics.Debug.WriteLine(stu.LastName);
// 通过点击的控件的DataContext判断所绑定的数据对象
// 然后从listbox里面获取到当前的ContentPresenter对象
ListBoxItem myListBoxItem = (ListBoxItem)(listbox.ContainerFromItem((sender as Panel).DataContext));
// 判断数据模板是选中状态的还是非选中状态的,然后进行赋值
// 在ListBoxItem中查找ContentPresenter ContentPresenter myContentPresenter=(ContentPresenter)FindVisualChild<ContentPresenter>(myListBoxItem); if (myContentPresenter.ContentTemplate.Equals(dataTemplateSelectName))
{
//赋值非选中状态的模板
myContentPresenter.ContentTemplate = dataTemplateNoSelectName;
}
else
{
//赋值选中状态的模板
myContentPresenter.ContentTemplate = dataTemplateSelectName;
} } //查找可视化树某个类型的元素
private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}

最新文章

  1. 判断一个 int 向量里是否有相同的数 并且距离在k之内 (2)
  2. Facebook的体系结构分析---外文转载
  3. 为简单而努力:Android封装类详解
  4. [iOS] 使用xib作为应用程序入口 with IDE
  5. uva 572 oil deposits——yhx
  6. cogs896 圈奶牛
  7. .net ftp上传文件方法
  8. cocos2dx libcurl
  9. firefly 问题
  10. Dealloc 在哪个线程执行
  11. android系统如何自适应屏幕大小
  12. Java静态代理和动态代理
  13. js - AO链 与 function
  14. 中文分词中的战斗机-jieba库
  15. django同时查询两张表的数据,合并检索对象返回
  16. Android研究之监听自身应用被卸载代码实现
  17. Linux系统从安装开始
  18. 【java集合系列】--- LinkedList
  19. ext整合highcharts实现饼图
  20. PythonStudy——Python 注释规范

热门文章

  1. React状态管理之redux
  2. String,StringBuffer和StringBuilder比较
  3. MPAndroidChart Wiki(译文)~Part 3
  4. webpy/flask/bottle性能测试
  5. from sklearn.datasets import make_classification创建分类数据集
  6. HihoCoder1050 树中的最长路 树形DP第三题(找不到对象)
  7. BZOJ2243 SDOI2011 染色 【树链剖分】
  8. 使用python处理selenium中的css_selector定位元素的模糊匹配问题
  9. SQL之 UNION ALL 和UNION
  10. Tencent Server Web 安装试用