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

我们都知道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);
            }
        }
    }

复制代码

这个方法共两个参

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该学生成绩信息管理系统涉及到学生、教师、系统管理员、班级、学生成绩、课程。设置一个系统管理员对系统进行管理。所有用户需输入账号、密码登录进入系统;管理员进入系统后可对学生、老师、班级、课程进行增删改查操作;学生进入系统,查看成绩、查看和修改自己的信息;老师进入系统后,对自己这门课程的学生设置课程成绩、查看和修改自己的信息,查看学生的信息和成绩、以及统计分析学生的成绩; 管理员为班级设置年级,为年级设置课程,为班级的每门课程设置老师,为学生设置班级。一个年级有多门课程(语文、数学、外语等等),班级的每门课程只能有一名老师,一个老师可以有多门课程;老师选择自己这门课程为该课程的学生登记成绩。老师可以查看其他老师的信息(可以当成是老师的通讯录),查看本课程学生的信息和成绩;学生可以查看班级其他同学的信息(可以看成是班级的同学录)。 考试分为两种,一种是年级统考,一种是平时考试。年级统考需要管理员事先添加一次年级统考,考试成绩出来后,老师进入系统选择该次考试为学生登记成绩。平时考试则是班级平时的考试,老师添加考试信息,登记成绩。成绩统计分析则是针对年级统考进行分析,主要涉及各学科分数名次,总分名次。 技术实现 系统环境:Windows开发工具:IDEAJava版本:JDK 1.8服务器:Tomcat 1.8数据库:MySQL 5.X系统采用技术:Servlet+Jsp+Jdbc+H-ui+EasyUI+jQuery+Html+Css+Ajax 系统功能系统主要分为三种用户角色,分别是管理员、老师以及学生,其具体功能如下: - 管理员   学生信息管理、教师信息管理、年级信息管理、班级信息管理、课程信息管理、考试信息管理,系统参数设置 - 老师   教学管理、教师个人信息维护、教师通讯录管理 - 学生考试成绩查询、学生通讯录、学生个人信息维护 运行截图 登录界面: 管理员界面: 考试列表:  成绩统计: 学生信息管理: 教师信息管理: 年级、班级信息管理:  系统设置: 教师界面:  成绩登记:  教师通讯录: 个人信息:  学生界面: 学生成绩查询: 班级通讯录: 学生个人信息:              

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值