前言

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

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

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

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

我上一篇文章《我们都知道,如何不被淘汰。》中谈到,开发人员分为程序员和代码工人两种。

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

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

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

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

DataGrid高级应用

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

过滤的原理是利用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界面:

接下来,我们看一下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

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

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

【我们一起写框架】MVVM的WPF框架(五)—完结篇的更多相关文章

  1. 【我们一起写框架】MVVM的WPF框架(一)—序篇

    前言 我想,有一部分程序员应该是在二三线城市的,虽然不知道占比,但想来应该不在少数. 我是这部分人群中的一份子. 我们这群人,面对的客户,大多是国内中小企业,或者政府的小部门.这类客户的特点是,资金有 ...

  2. 【我们一起写框架】MVVM的WPF框架(二)—绑定

    MVVM的特点之一是实现数据同步,即,前台页面修改了数据,后台的数据会同步更新. 上一篇我们已经一起编写了框架的基础结构,并且实现了ViewModel反向控制Xaml窗体. 那么现在就要开始实现数据同 ...

  3. 【我们一起写框架】MVVM的WPF框架(三)—数据控件

    这世上,没人能一次性写出完美无缺的框架:因为,任何一个框架都需要项目的淬炼,然后才能升华,趋近完美. 所以,框架是个反复修改的东西,最终形成的东西. 如果你学了一点技术,觉得自己可以写出框架了,觉得自 ...

  4. 【我们一起写框架】MVVM的WPF框架(四)—DataGrid

    前言 这个框架写到这里,应该有很多同学发现,框架很多地方的细节,其实是违背了MVVM的设计逻辑的. 没错,它的确是违背了. 但为什么明知道违背设计逻辑,还要这样编写框架呢? 那是因为,我们编写的是框架 ...

  5. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

  6. 锋利的jQuery--编写jQuery插件(读书笔记五)[完结篇]

    1.表单验证插件Validation   2.表单插件Form   3.动态事件绑定插件livequery 可以为后来的元素绑定事件   类似于jQuery中的live()方法     4.jQuer ...

  7. 剖析手写Vue,你也可以手写一个MVVM框架

    剖析手写Vue,你也可以手写一个MVVM框架# 邮箱:563995050@qq.com github: https://github.com/xiaoqiuxiong 作者:肖秋雄(eddy) 温馨提 ...

  8. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

  9. 前端框架MVVM是什么(整理)

    前端框架MVVM是什么(整理) 一.总结 一句话总结:vm层(视图模型层)通过接口从后台m层(model层)请求数据,vm层继而和v(view层)实现数据的双向绑定. 1.我大前端应该不应该做复杂的数 ...

随机推荐

  1. 学习ASP.NET Core Razor 编程系列九——增加查询功能

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  2. JQuery(三)-- AJAX的深入理解以及JQuery的使用

    HTTP HTTP http: 超文本传输协议.特点:  简单.快速.灵活.无状态.无连接 URL: 统一资源定位符. 组成:协议名://主机IP:端口号/项目资源地址?传递参数的键值对#锚点 ①ip ...

  3. php定时执行操作及ob_flush()与flush()的使用

    版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.csdn.net/qq_38125058 一: 每隔30s执行一次,将字符串写入文件 // 30秒执行一次 ignore_ ...

  4. 语音识别中的CTC算法的基本原理解释

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文作者:罗冬日 目前主流的语音识别都大致分为特征提取,声学模型,语音模型几个部分.目前结合神经网络的端到端的声学模型训练方法主要CTC和基 ...

  5. SQL之left join,inner join,right join

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  6. java 修饰符的访问权限

    private,public,protected,默认不写(firendly) 1.Class类的访问权限: public:可以供所有的类访问. 默认:默认可以称为friendly但是,java语言中 ...

  7. c++右值引用以及使用

    前几天看了一篇文章<4行代码看看右值引用> 觉得写得不错,但是觉得右值引用的内容还有很多可以去挖掘学习,所以总结了一下,希望能对右值引用有一个更加深层次的认识 一.几个基本概念 1.1左值 ...

  8. vs2017 x64 ibatis.net 平台调用 Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342 x64

    遇到的问题: 1.x86无法调用x64 2.调用ibatis.net的providers.config无法通过节点反射查找Oracle.DataAccess, Version=2.112.1.0, C ...

  9. 'version' contains an expression but should be a constant

    [WARNING] Some problems were encountered while building the effective model for com.app:cache:jar:4. ...

  10. javascript 内存管理

    1.垃圾回收机制 在编写Javascript程序时,开发人员不用关心内存问题,内存分配及无用内存的回收完全实现了自动化管理.垃圾收集器会按照预定的时间间隔, 周期性的找出那些不再继续使用的变量,然后释 ...