设置itemcontrol的item点击前后不同状态
2015-04-06 16:43
405 查看
转自:/article/4798260.html
在这里还要注意一点的是,如果使用的时ListBox控件而不是ItemsControl控件的时候,在获取ContentPresenter对象的时候需要通过可视化树去查找。代码的实现如下所示:
<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; }
相关文章推荐
- 设置itemcontrol的item点击前后不同状态
- android Listview中设置enable状态,显示点击的item
- devExpress GridControl repositoryItemCheckEdit 设置值对应的选中状态
- WPF:设置MenuItem多种不同状态图标
- listview为不同的item设置不同的点击事件
- Androd中 listView点击每一个 Item里面的状态,跳转到相对应的不同 界面
- android中通过网络请求数据显示在Listview中,面对许多的item,如何给每个item设置点击事件以跳转到不同的activity
- ListView中设置item点击状态的背景色
- iOS开发:在XIB中设置按钮不同点击状态下的不同图标显示
- 记录:在使用 Adapter是对 item的点击设置,合并,不同布局实现
- cocos js 怎样设置一个按钮(MenuItemSprite)为不可点击状态?
- android 如何设置checkbox、edittext点击前后不同样式
- 利用selector设置ImageButton不同状态下的背景图片
- jquery ajax 中 complete,success,error 事件 在设置了超时状态下的不同表现
- MulValueItem 点击状态切换机制
- 根据不同条件设置ITEM的背景色和鼠标移动时的背景色
- ListView 点击Item 无颜色xml 中的设置
- 代码设置按钮不同状态的颜色
- dreamweaver随记------dreamweaver中设置超链接不同状态时的样式
- 动态添加UIButton控件,通过设置tag值实现点击不同的UIButton控件做出不同的反应