zoukankan      html  css  js  c++  java
  • 设置itemcontrol的item点击前后不同状态

    转自: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;
            }
    
  • 相关阅读:
    做好技术的量的累积,实现业绩的质的飞跃|专访宜信财富技术负责人刘宝剑
    深入理解MySQL索引
    程序的一生:从源程序到进程的辛苦历程
    Serializable详解(1):代码验证Java序列化与反序列化
    关于Java序列化的问题你真的会吗?
    Dubbo源码解析之SPI(一):扩展类的加载过程
    [C#] 命令总线模式
    C#构造函数在继承时必须要求与父类型构造函数入参相同怎么办?
    如何通过JavaScript构建Asp.net服务端控件
    Javascript iframe交互并兼容各种浏览器的解决方案
  • 原文地址:https://www.cnblogs.com/ggzone/p/10121286.html
Copyright © 2011-2022 走看看