WPF源代码分析系列一:剖析WPF模板机制的内部实现(五)

本文详细分析了WPF中ItemsControl的模板机制,探讨了ItemsControl.ItemTemplate如何影响元素生成,以及ItemsControl如何通过ItemContainerGenerator与Panel协同工作,生成并准备容器以展示数据项。过程中涉及ItemContainerGenerator的Refresh方法、PrepareContainerForItemOverride方法,以及ItemsPresenter和ItemsPanelTemplate的角色。通过对ItemsControl模板应用机制的梳理,理解了数据项如何与UI元素对应并展现。
摘要由CSDN通过智能技术生成

我们都知道ItemsControl控件在WPF中的重要性,ItemsControl.ItemTemplate用的也非常多,那么其在模板应用中的角色是什么呢?要回答这个问题,我们先看其定义:
复制代码

public static readonly DependencyProperty ItemTemplateProperty =
            DependencyProperty.Register(
                    "ItemTemplate",
                    typeof(DataTemplate),
                    typeof(ItemsControl),
                    new FrameworkPropertyMetadata(
                            (DataTemplate) null,
                            OnItemTemplateChanged));

    /// <summary>
    ///     ItemTemplate is the template used to display each item.
    /// </summary>public DataTemplate ItemTemplate
    {
        get { return (DataTemplate) GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }

    private static void OnItemTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((ItemsControl) d).OnItemTemplateChanged((DataTemplate) e.OldValue, (DataTemplate) e.NewValue);
    }

    protected virtual void OnItemTemplateChanged(DataTemplate oldItemTemplate, DataTemplate newItemTemplate)
    {
        CheckTemplateSource();

        if (_itemContainerGenerator != null)
        {
            _itemContainerGenerator.Refresh();
        }
    }

复制代码

可以看到当ItemsControl.ItemTemplate改变时,会调用_itemContainerGenerator.Refresh()。这个方法的定义如下:
复制代码

    // regenerate everything
    internal void Refresh()
    {
        OnRefresh();
    }

    // Called when the items collection is refreshed
    void OnRefresh()
    {
        ((IItemContainerGenerator)this).RemoveAll();

        // tell layout what happened
        if (ItemsChanged != null)
        {
            GeneratorPosition position = new GeneratorPosition(0, 0);
            ItemsChanged(this, new ItemsChangedEventArgs(NotifyCollectionChangedAction.Reset, position, 0, 0));
        }
    }

复制代码

可见这个方法调用OnRefresh(),后者的主要工作是清空已经生成的元素,并触发ItemsChanged事件,通知所有监听者列表已经被重置。

查找ItemsControl.ItemTemplate的引用会发现一个值得注意的方法ItemsControl.PrepareContainerForItemOverride:
复制代码

//ItemsControl****

    /// <summary>
    /// Prepare the element to display the item.  This may involve
    /// applying styles, setting bindings, etc.
    /// </summary>
    protected virtual void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        // Each type of "ItemContainer" element may require its own initialization.
        // We use explicit polymorphism via internal methods for this.
        //
        // Another way would be to define an interface IGeneratedItemContainer with
        // corresponding virtual "core" methods.  Base classes (ContentControl,
        // ItemsControl, ContentPresenter) would implement the interface
        // and forward the work to subclasses via the "core" methods.
        //

        // While this is better from an OO point of view, and extends to
        // 3rd-party elements used as containers, it exposes more public API.
        // Management considers this undesirable, hence the following rather
        // inelegant code.
        www.shxjpco.com
        HeaderedContentControl hcc;
        ContentControl cc;
        ContentPresenter cp;
        ItemsControl ic;
        HeaderedItemsControl hic;
       www.shczh168.com
        if ((hcc = element as HeaderedContentControl) != null)
        {
            hcc.PrepareHeaderedContentControl(item, ItemTemplate, ItemTemplateSelector, ItemStringFormat);
        }
        else if ((cc = element as ContentControl) != null)
        {
            cc.PrepareContentControl(item, ItemTemplate, ItemTemplateSelector, ItemStringFormat);
        }
        else if ((cp = element as ContentPresenter) != null)
        {
            cp.PrepareContentPresenter(item, ItemTemplate, ItemTemplateSelector, ItemStringFormat);
        }
        else if ((hic = element as HeaderedItemsControl) != null)
        {
            hic.PrepareHeaderedItemsControl(item, this);
        }
        else if ((ic = element as ItemsControl) != null)
        {
            if (ic != this)
            {
                ic.PrepareItemsControl(item, this);
            }
        }
    }

复制代码

这个方法共两个参

一、项目简介 本项目是一套基于JavaWeb的学生成绩管理系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具、项目说明等,该项目可以直接作为毕设使用。 项目都经过严格调试,确保可以运行! 二、技术实现 ​后台框架:JSP、Servlet、JDBC ​数据库:MySQL 开发环境:JDK、Eclipse、Tomcat 三、系统功能 该学生成绩管理系统采用B/S结构,使用JAVA开发语言,结合JSP技术,以MySQL作为后台数据库。 该系统共包含三种角色:学生、教师、管理员。 系统功能主要分为七大模块: (1)学生基本信息管理 该模块主要是存储学生的个人信息,如姓名、年龄、电话、班级、专业、考试成绩等,并实现按不同条件对这些数据进行查询的功能。 (2)教师基本信息管理 该模块主要是对老师的个人信息进行存储和索引,如姓名、年龄、婚姻状态、课程、工作时间等,并实现按不同条件对这些数据进行查询的功能。 (3)班级信息管理 该模块主要是对每个班级的基本信息进行有效管理,包括学生个数、学生信息、班干部信息、教师信息等。 (4)课程信息管理 该模块主要存储所有的课程信息,教师、学生等可以根据使用查询自己的课程信息。 (5)成绩信息管理 该模块主要实现对每一次成绩进行管理,成绩信息导入、统计、汇总。 (6)系统设置 该模块主要实现对操作员及操作员密码进行有效管理、学生和教师信息相关功能进行管理。 (7)考勤管理 该模块主要实现学生上课考勤、教师上课考勤的管理,并有相关的考勤统计信息展示。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
java web学生成绩后台管理系统,基于mvc设计模式实现,可以做为java毕业设计项目 项目描述 (1)该系统的用户分为教师和学生。教师的功能有:管理某一学生或课程的信息以及成绩,包括增、删、查、报表打印等;学生用户只能查看个人的信息以及成绩。 (2)系统运行在Windows平台上,要求有一个较好的图形用户界面,操作要求简单。 (3)运用学生成绩管理维护系统可以减轻学院教学人员的工作量,缩小开支,提高工作效率与准确率,能够节省时间,学生也能够尽快的知道自己的考试成绩,投入新的课程的学习或复习这次没有考过的课程。而学生成绩管理系统的应用也为今天的民办教育在未来市场的竞争力有所提高。 (4)学生成绩管理是一个非常繁琐与复杂的一项工作,一个原因就是工作量大,不好管。对于一个学校而言,管理好学生的成绩,是非常重要的。因此开发出一套学生成绩管理系统是非常必要的。 关于用户对我们产品的相关需求和建议: 1.界面尽量人性化,容易操作,简单易懂; 2.功能齐全,只有你想不到的,没有我们做不到的; 3.页面整体设计上应尽量美观大方; 4.操作上能够根据需求进退自如。 运行环境 jdk7+tomcat7+mysql 项目技术(必填) Servlet+JSP+jdbc+bootstrap+jquery+js 数据库文件 链接: https://pan.baidu.com/s/1LDn-ssmcqphqI8HKwqAfJg 密码: ynbe jar包文件 链接:https://pan.baidu.com/s/1CJAQAT74hKD1MlsVwbCdCw 提取码:vuex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值