设置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;
        }
原文地址:https://www.cnblogs.com/ggzone/p/10121286.html