欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【我们一起写框架】MVVM的WPF框架(五)—完结篇

程序员文章站 2024-01-27 08:54:04
前言 这篇文章是WPF框架系列的最后一篇,在这里我想阐述一下我对框架设计的理解。 我对框架设计的理解是这样的: 框架设计不应该局限于任何一种设计模式,我们在设计框架时,应该将设计模式揉碎,再重组;这样设计出来的框架才具有一战之力。 框架设计应该根据项目团队成员水平量身定制。 我上一篇文章《我们都知道 ......

前言

这篇文章是wpf框架系列的最后一篇,在这里我想阐述一下我对框架设计的理解。

我对框架设计的理解是这样的:

框架设计不应该局限于任何一种设计模式,我们在设计框架时,应该将设计模式揉碎,再重组;这样设计出来的框架才具有一战之力。

框架设计应该根据项目团队成员水平量身定制。

我上一篇文章《》中谈到,开发人员分为程序员和代码工人两种。

这两种开发人员的技术实力差距是巨大的;如果框架设计时不考虑团队成员的技术实力,那么框架很难发挥出最高战力。

比如,如果开发人员大多是代码工人,那么,在设计框架时,要尽量将分工明确考虑进来,让每个人只负责自己模块。最简单的例子就是,前后端分离。

如果开发人员大多是程序员,那么,在设计框架时,要尽量设计业务线性模块,让每个人可以掌控一条业务线,尽量不要前后端分离,尽量采取敏捷设计模式,甚至,可以开放一部分项目经理的职权给开发人员,最大化生产力。

那么,现在我们一起回头看看已经编写完的框架;我们会发现,它是一个将前后台融合,适合程序员团队的框架。

datagrid高级应用

在高级应用中,我们对表格增加了过滤功能。界面效果如下:

 【我们一起写框架】MVVM的WPF框架(五)—完结篇

过滤的原理是利用icollectionview的filter属性实现的,由于代码比较多,这里就只列出一部分关键代码,具体代码大家可以去github上下载。

itemssourceview.filter = new predicate<object>((obj) =>
{
    bool isfilter = true; 
    foreach (filterproperty pinfo in comparepropertylist) //循环筛选出来需要比较的属性
    { 
        string columnnameen = pinfo.propertyname;
     var filtervalue = pinfo.propertyvalue;//过滤的值
     string columntype = pinfo.propertyinfo.propertytype.tostring().replace("system.nullable`1[", "").replace("]", "").replace("system.", "").tolower();

        if (filtervalue != null)
        {
            #region 重点内容 这里开始执行真正的比较
            object rowvalue = toolfunction.getpropertyvalue(obj, pinfo.propertyinfo);//数据行的值
            if (rowvalue == null)
            {
                if (filtervalue.tostring() == "")
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                isfilter = comparevalue(columntype, rowvalue, filtervalue, pinfo.conditionstr);
            }
            #endregion
        }
        if (!isfilter)
        {
            return isfilter;
        }
    }
    return isfilter;
});

这上面简短的代码中,我们使用了icollectionview类型的itemssourceview.filter的方法来实现了过滤。

在代码中可以看到,我们为filter赋值了一个匿名委托;这个委托有一个入参和一个返回值;其中,入参是我们表格中的行的datacontext,返回值是bool类型,表示这行在表格中是否显示。

接下来,我们在委托中对行的datacontext数据进行了比较处理,根据比较结果来确定,该行是否显示。

ui控件

在这个框架里,我们ui控件的目的提高ui与viewmodel的内聚,所以,这里的ui控件是一定要和viewmodel打配合的。

这里我编写了一个datagrid的ui控件,由于这个控件是最复杂的,如果大家能理解这个控件,相信,其他控件也可以信手捏来。

首先,我们先看下ui界面:

【我们一起写框架】MVVM的WPF框架(五)—完结篇

接下来,我们看一下xaml界面的代码,代码如下:

<pv:kdatagrid  margin="10,10,10,10" datacontext="{binding datagrid,mode=twoway,updatesourcetrigger=propertychanged}" > 
</pv:kdatagrid>  

代码很简洁,我们只要绑定datacontex即可,当然绑定的数据源是我们的数据控件datgrid。

然后,我们看下viewmodel的代码,代码如下:

public vm_pageuserlist()
{
    static.staticdata.datagridconfig.add(testdataproxy.getdatagridconfig());
    datagrid.datagridname = "用户信息列表";
    datagrid.skipnumber = 3;
    datagrid.bindsource(load, null);
}

在代码中可以看到,我们首先通过testdataproxy.getdatagridconfig()方法,从代理中获取了表格配置。

然后将表格配置赋值给了静态变量static.staticdata.datagridconfig。

然后确定了当前表格的配置名datagridname为[用户信息列表] 。

接下来我们正常配置,就实现了表格的展示。

其中表格配置类datagridconfig代码如下:

public partial class datagridconfig
{
    [datamember]
    public list<columnconfig> columnconfig { get; set; }
    [datamember]
    public int datagridid { get; set; }
    [datamember]
    public string datagridtemplatename { get; set; }
    [datamember]
    public bool hasfilter { get; set; }
    [datamember]
    public bool haspaging { get; set; }
    [datamember]
    public int companyid { get; set; }
    [datamember]
    public int userid { get; set; }
    [datamember]
    public string rowforegroundconvert { get; set; } 
    [datamember]
    public bool hasno { get; set; } 
    [datamember]
    public int frozencolumncount { get; set; }
    [datamember]
    public bool hidecontrolrow { get; set; }   
}

这里,我们定义了列的集合,和表格的一些基础配置,比如是否开启过滤,是否开启分页等等。

由于代码实在比较多,所以,这里就只列出一部分关键代码了,具体代码还请大家去github上下载阅读。

其实,这里的ui控件编写,只是为大家提供一个思路,毕竟现实中业务所需的控件是千奇百怪的,我们是没办法编写出一个万能控件的。

----------------------------------------------------------------------------------------------------

wpf框架系列文章,到此就完结了。

框架代码已经传到github上了,欢迎大家下载。

相关文章:

【我们一起写框架】mvvm的wpf框架(一)—序篇

【我们一起写框架】mvvm的wpf框架(二)—绑定

【我们一起写框架】mvvm的wpf框架(三)—数据控件

【我们一起写框架】mvvm的wpf框架(四)—datagrid

github地址:https://github.com/kiba518/kibaframework

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错,请点击下右下角的推荐】,非常感谢!