设置itemcontrol的item点击前后不同状态

来源:互联网 发布:政府集中采购流程 知乎 编辑:程序博客网 时间:2024/05/29 10:07

转自: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;        }
0 0
原创粉丝点击