WF4设计器数据模型:ModelItem和ModelProperty

简介:

下面是WF设计器结构的基本概述。如下:

image

这里有几个重要组成部分:

  • Source:在VS中,就是XAML,但是这代表了我们正在编辑的持久存储。
  • Instance:代表在内存中正在编辑的条目,对于vs2010中的WF设计器,对应一个System.Activities实例(对象树层次结构)。
  • Model Item Tree :作为View和Instance之间的媒介,并负责对更改通知和跟踪比如撤消状态。
  • Design View:呈现给用户的可视化的编辑视图,这个设计器是用WPF编写的。
  • Metadata Store:类型和设计器之间的映射的一个属性表。

在看上面的图的时候你可能会认为,可以将DesignView直接绑定到Instance,这种方式可以工作,但会有很多问题,最明显的问题是我们的活动类型不会从DependencyObject继承或实现INotifyPropertyChanged的接口。我们也不能指定所有集合都是ObservableCollection(ObservableCollection 已从 WindowsBase.dll 移到 System.dll)。另外,我们要考虑支持一些设计时服务比如撤销/重复,而且在跨越许多对象类型的过程中我们需要确保始终能够处理这些,包括那些不是被我们写的类型。如果我们直接从View到Instance,就将二者仅仅的耦合在一起,会给我们将来做更有趣的事带来不便。例如,我们想要增加更新对象实例的重构支持,我们需要做的不仅仅是对象图,model item tree也需要跟踪很多变化。

The ModelItem tree 

来看一个例子,这个例子和WF的设计器并没有直接的关系,只是来模拟这种方式:

public class Animal
{
    // simple property
    public string Name { get; set; }
    // complex property 
    public Location Residence { get; set; } 
    // list 
    public List<Animal> CloseRelatives { get; set; }
    // dictionary
    public Dictionary<string, object> Features { get; set; } 
}

public class Location
{
    public string StreetAddress { get; set; }
    public string City { get; set; }
    public string State { get; set; } 
}
 
EditingContext ec = new EditingContext();
var companion1 = new Animal { Name = "Houdini the parakeet" };
var companion2 = new Animal { Name = "Groucho the fish" };
var animal = new Animal 
                 {
                       Name = "Sasha the pug",
                       Residence = new Location 
                       {
                           StreetAddress = "123 Main Street",
                           City = "AnyTown",
                           State = "Washington"
                       },
                       Features = { 
                          {"noise", "snort" },
                          {"MeanTimeUntilNaps", TimeSpan.FromMinutes(15) }
                       },
                       CloseRelatives = { companion1, companion2 } 
               };
ModelTreeManager mtm = new ModelTreeManager(ec);  mtm.Load(animal);
ModelItem mi = mtm.Root;
 

下图是Animal与ModelItem和ModelProperty的对应关系:

IMAG0111
 
下图可以看到一些具体的属性情况:
image
 
可以通过下面方式来获得相关属性值:
root.Properties["Residence"].
                Value.
                Properties["StreetAddress"].
                Value.GetCurrentValue()
你可能觉得上面的方式比较丑陋,但是在XAML中可以ModelItem.Location.StreetAddress自动路由过来,而其WF团队还承诺正式版会增加Dynamic的支持。
下面是一些测试:

   1:  ModelItem root = mtm.Root;
   2:  Assert.IsTrue(root.GetCurrentValue() == animal, "GetCurrentValue() returns same object");
   3:  Assert.IsTrue(root.ItemType == typeof(Animal),"ItemType describes the item");
   4:  Assert.IsTrue(root.Parent == null,"root parent is null");
   5:  Assert.IsTrue(root.Source == null, "root source is null");
   6:  Assert.IsTrue(((List<Animal>)root.Properties["CloseRelatives"].ComputedValue)[0] == companion1, 
   7:             "ComputedValue of prop == actual object");
   8:  Assert.IsFalse(((List<Animal>)root.Properties["CloseRelatives"].ComputedValue)[0] == companion2, 
   9:             "ComputedValue of prop == actual object");
  10:  Assert.AreEqual(root.Properties["Residence"].
  11:      Value.
  12:      Properties["StreetAddress"].
  13:      Value.GetCurrentValue(), "123 Main Street", "get actual value back out");
  14:  Assert.AreEqual(root, root.Properties["Residence"].Parent, "property points to owner");
  15:  ModelItem location = root.Properties["Residence"].Value;
  16:  Assert.AreEqual(root.Properties["Residence"], location.Source, "sources point to the right place");
 

   1:  EditingContext ec = new EditingContext();
   2:  ModelTreeManager mtm = new ModelTreeManager(ec);
   3:  mtm.Load(new Sequence());
   4:  mtm.Root.Properties["Activities"].Collection.Add(new WriteLine());
本文转自生鱼片博客园博客,原文链接:http://www.cnblogs.com/carysun/archive/2009/11/20/WF4-ModelItem.html,如需转载请自行联系原作者
相关文章
|
存储 NoSQL 数据库
数据模型
一、数据模型 数据模型是用于描述现实世界中各种实体、属性和实体之间关系的一种抽象表示方法。它是在计算机系统中对数据进行组织和管理的基础,用于定义数据的结构、约束和操作。 数据模型可以分为以下几种类型: 1. 层次模型:层次模型是一种树状结构的数据模型,其中数据以层次结构进行组织。每个节点可以有多个子节点,但只能有一个父节点。典型的层次模型是树形数据库。 2. 网状模型:网状模型是一种复杂的数据模型,其中数据之间可以有多对多的关系。网状模型使用指针来表示数据之间的关系,典型的网状模型是CODASYL数据库。 3. 关系模型:关系模型是一种基于关系代数的数据模型,其中数据以表的形式进行组织。关系模
123 0
ly~
|
3月前
|
供应链 搜索推荐 安全
大数据模型的应用
大数据模型在多个领域均有广泛应用。在金融领域,它可用于风险评估与预测、智能营销及反欺诈检测,助力金融机构做出更加精准的决策;在医疗领域,大数据模型能够协助疾病诊断与预测、优化医疗资源管理和加速药物研发;在交通领域,该技术有助于交通流量预测、智能交通管理和物流管理,从而提升整体交通效率;电商领域则借助大数据模型实现商品推荐、库存管理和价格优化,增强用户体验与企业效益;此外,在能源和制造业中,大数据模型的应用范围涵盖从需求预测到设备故障预测等多个方面,全面推动了行业的智能化转型与升级。
ly~
271 2
|
3月前
|
存储 Oracle 数据建模
大工程 从0到1 数据治理 之数据模型和设计篇(sample database classicmodels _No.7)
大工程 从0到1 数据治理 之数据模型和设计篇(sample database classicmodels _No.7)
53 0
|
8月前
|
存储 大数据 数据管理
数据模型设计
数据模型设计
|
JSON 前端开发 JavaScript
如何应用数据模型?
数据模型对于常规的数据查询或填写数据提交,是否有使用场景或者价值?数据模型这条路走的是否有问题?
如何应用数据模型?
|
前端开发 数据库
统一数据模型(Universal Data Model)系列一
# 引言 > > 当我们开始一个新的业务应用设计开发呢,无论是前台应用还是中后台应用,在前后端分离的团队组织划分及协作时,前台应用专注于交互体验的提升,涉及到多端(PC,H5,iOS,Android,小程序 - 支付宝,淘宝,微信...),大量的创新在于如何同一个页面开发复用提效统一输出到各端,定义DSL,结合可视化搭建,no code/low code进行页面开发;同时应对各端所需求数据的
4286 1