用数据控制用户界面属性的系统和方法

文档序号:6402262阅读:183来源:国知局
专利名称:用数据控制用户界面属性的系统和方法
本申请由美国的和常驻美国的微软公司于2003年5月17日作为PCT申请提出的,指定除了美国之外所有的国家。
发明的背景为用户提供信息的方式可以影响到用户理解和领会该信息的能力。在计算机显示器上,通过使用颜色,字形等等来将重点加入到信息中成为一个标准的习惯。该重点使用户更加容易领会信息的重要性。处理显示信息(用户界面)的代码和执行信息上应用程序的代码逻辑典型地密切相关。例如,所述逻辑直接用数据分配用户界面属性(例如,颜色,字体,位置,大小)。因此,当用户界面发生变化时,该逻辑也必须改变。例如,就一个文本框来说,用户界面代码得知以便决定文本是否改变,并基于一个改变,用户界面代码确认已经改变的文本然后显示该改变的文本。用户界面和逻辑密切相关的特性导致脆弱的代码。维护该脆弱的代码是非常昂贵和费时的。
发明概述本发明涉及一种用数据控制用户界面的系统和方法。本发明通过提供一个用于将数据与用户界面相结合的机制,将用户界面和数据连同它的应用程序逻辑相分离。本发明使用户界面设计者和撰写应用程序逻辑的应用程序创造者能够独立地工作。设计者和创造者都不需要理解对方的代码或不影响对方的代码开发。本发明也允许容易地改变用户界面。例如,当新的和更多的用户要求的用户界面平台变得可利用时或者当用户界面设计者想要改变应用程序的外表时,该设计者不需要改变应用程序逻辑。另外,用于将数据与用户界面结合的机制是动态的。这允许数据中的任何变化在显示中被自动的反映。另外,通过用户界面从用户输入的任何数据可以自动地更新。因为本发明允许不仅用户界面的数据显示方面(例如,文本)的关联,而且运行用户界面视觉方面(例如,背景,字体大小,等等)的关联,所以可以提供数据的视觉的增强和灵活的显示。例如,负数可以用红色显示或者当股票价钱增长的时候可以出现一个向上的箭头。
因此,根据本发明,应用程序被分为独立的部分,一个逻辑部分和一个用户界面部分。逻辑部分处理应用程序中的数据值。用户界面部分负责数据的显示。绑定规范描述了用户界面属性和数据值之间的关系。系统级别代码使用绑定规范来决定当数据值经历变化时通知的方式以及指导用户界面部分来反映用户界面属性的变化的方式。绑定规范确定一个源数据项,源数据项中到数据值的一个路径,一个目标用户界面元素,和目标用户界面元素上的用户界面属性。该绑定规范可以使用代码或标记语言来指定。
附图的简要说明

图1说明了一种代表性的计算设备,该设备可以用于本发明的说明性的实现中。
图2说明了根据本发明用数据控制的用户界面属性的一个实施例的功能结构框图。
图3说明了根据本发明的一个实施例用数据值绑定用户界面属性的一个处理的逻辑流程图。
图4说明了根据本发明用于将用户界面属性与数据相结合的多个代表性的语法。
优选实施例的详细说明本发明涉及一种用数据控制用户界面的系统和方法。本发明通过提供一个用于将数据与用户界面相结合的机制,将用户界面和应用程序逻辑相分离。如下面将要详细描述的,这种用户界面与数据连同与它相联系的逻辑的分离,允许不同组的开发者在不影响其他组的代码开发的情况下,在用户界面和逻辑上独立地工作。另外,如以下所详细描述的,本发明提供了一个用于从数据源到用户界面自动传送值的系统和机制,反之亦然。贯穿以下的讨论,术语“数据绑定”是指将数据值与用户界面属性相联系,传送和更新数据值,等等的过程。
计算环境说明图1说明了一种代表性的计算设备,该设备可以在本发明的说明性的执行中被使用。参照图1,在最基本的结构中,计算设备100典型地至少包括一个处理单元102和系统存储器104。根据计算设备100的精确的结构和类型,系统存储器104可以是易失性的(例如随机存储器),非易失性的(例如只读存储器,闪存,等等)或两者的结合。系统存储器104典型地包括一个操作系统105,一个或多个程序模块106,并且可以包括程序数据107。程序模块106的例子包括一个浏览器应用程序,一个金融管理应用程序,一个字处理器,等等。这个基本的结构在图1中通过虚线108中的那些部件而被说明。
计算设备100可以具有额外的特征或功能。例如,计算设备100也可以包括额外的数据存储设备(可移动的和/或不可移动的)例如,磁盘,光盘,或磁带。该额外的存储器在图1中由可移动的存储器109和不可移动的存储器110说明。计算机存储介质可以包括易失性和非易失性的,在任意的方法或技术中被执行用于信息的存储的可移动和不可移动的介质,例如计算机可读指令,数据结构,程序模块,或其他数据。系统存储器104,可移动存储器109和不可移动存储器110都是计算机存储介质的例子。计算机存储介质包括,但并不被限定为,随机存储器,只读存储器,电可擦除只读存储器,闪存或其他存储技术,光盘驱动器,数字化视频光盘(DVD)或其他光学存储器,盒式磁带,磁带,磁盘存储器或其他磁存储设备,或任何其他可以用于存储想要的信息以及可以由计算设备100存取的介质。任何这种计算机存储介质可以是设备100的一部分。计算设备100也可以具有输入设备112例如键盘,鼠标,输入笔,声音输入设备,触摸式输入设备,等等。也可以包括输出设备114例如显示器,扬声器,打印机,等等。这些设备在现有技术中是公知的所以在这里不需要长篇的论述。
计算设备100也可以包括通信线路116,该线路允许设备100与其他计算设备118通信,例如通过一个网络。通信线路116是通信介质的一个例子。通信介质典型地可以由计算机可读指令,数据结构,程序模块,或调整的数据信号中的其他数据而具体化,例如载波或其他传送机制,并且包括任何信息传送介质。术语“调制的数据信号”是指一个信号,该信号具有一个或多个采用以所述方式设置或改变的特征以便在信号中编码信息。作为例子,并且不是限定性的,通信介质包括有线介质例如有线网络或单线线路,和无线介质例如声学,广播,红外线和其他无线介质。这里使用的术语计算机可读介质包括存储介质和通信介质。
实现说明图2是一个功能结构框图,说明了根据本发明用数据控制用户界面属性的系统200的一个实施例。系统200包括一个应用程序202,一个平台220,和一个数据源230。应用程序202可以是图1中所示的计算设备100上的应用程序106之一。应用程序202包括用于操作数据值(例如,源数据值238)的代码(以下称作逻辑204)。通常,逻辑204执行数据值的确认和数据值更新。数据值(例如,数据值238)表示数据项(例如,数据项232)的属性(即,数据源属性)的内容。数据项232位于数据源(例如,数据源230)中。每一个数据源230可以包括许多数据项,每一个数据项具有一个或多个属性,在其中源数据值被存储。逻辑203可以从多个数据源操作数据值。该数据源可以包括一个XML文件,一个对象,一个数据集合,等等。如下面将被大量详细讨论的,数据项的每一个属性可以被用于控制用户界面(UI)。
应用程序202也包括用于显示信息的代码(以下称作用户界面206)。该用户界面206包括许多用户界面元素(例如,用户界面元素208)。每一个用户界面元素208包括一个或多个属性(例如,用户界面属性210和212),例如用于显示文本,颜色,字体,位置,大小,等等。另外,如随后详细描述的,根据本发明这些用户界面属性210和212与一个或多个数据值238和242相联系。通常,通过平台220中的绑定引擎224发生联系。该平台220代表服务的系统层,例如一个操作系统,一个虚拟引擎,等等。该平台220也包括一个负责维护关于数据值234和242的分级信息以及负责更新与属性相关的数据值的属性引擎222。即使绑定引擎224和属性引擎222作为单独的部件被显示,本领域的技术人员将认识到,在不脱离本发明的情况下,每个部件所提供的功能可以包括在一个部件中。
数据值238和242与它们的用户界面属性210和212的联系(例如,绑定)由图2中从数据值到用户界面属性的折线表示(以下称作绑定226和228)。在以下的讨论中,术语“数据值”可以与术语“源数据值”交替使用。同样地,术语用户界面属性可以与术语“目标属性”交替使用。这些绑定226和228允许从数据值(例如,源数据值)自动设置动态属性(例如,目标属性),例如从任意对象的属性。这些绑定可以是动态的以至于约束目标属性自动地更新来反映源数据值中的变化。
为了提供这种自动更新的能力,本发明进一步提供了一种通知机制(例如,图2中由通知者236和240以及从通知者到平台220的箭头表示)。每一个数据项232和234分别具有一个相应的通知者236和240。该通知机制负责通知系统源数据值发生了变化以及数据值可以被传送到目标属性(例如,用户界面属性)。
当创建一个绑定226和228时,例如通过标记,代码,等等,该绑定引擎224创建一个与该绑定相联系的绑定对象(例如,绑定对象250和252)。例如,绑定对象252可以表示绑定引擎224中的绑定228。每一个绑定对象包括许多属性(例如,绑定属性260-272)。这些绑定属性260-272中的每一个可以被程序化地设置。下面的讨论分别描述这些属性并且图4说明了用于激活一个指定了这些属性的绑定的代表性的代码。
绑定属性之一(以下称作路径260)确定设置源数据值的方式(通过源对象)。路径260可以指源对象上的一个属性,子属性或索引,ADO中的列(激活X数据对象),XML上的一个X路径,等等。可选地,该路径可以指一个反映或ADO路径。
另外一个绑定属性(以下称作绑定类型262)为绑定226和228定义一个类型。在一个实施例中,该绑定类型包括单向的,双向的,和一次性的。作为一个说明,绑定226表示一个双向绑定而绑定228表示一个单向绑定。这些绑定类型之一作为一个默认值被设置。在一个实施例中,双向绑定被设置为默认绑定类型。
当绑定类型262被指定为单向时,每当相联系的源数据值发生变化时,发信号通知绑定引擎224更新目标属性(例如,用户界面属性210)。单向绑定类型有利于将数据值绑定到一个不可编辑的用户界面属性,例如文本颜色,文本背景,等等。使用单向绑定类型可以回避双向绑定类型的费用,如在下面所描述的。当得知用户界面属性中关于设计内容的改变时,这种费用的减少是最值得关注的。对于这些用户界面属性,为了改变用户界面属性,必须侦听用户界面属性的每一个子属性的动态属性。当用户界面属性中的变化仅仅是为了显示其他表述细节时,单向绑定类型也是有用的。
当绑定类型262被指定为双向时,每当源数据值发生变化时,发信号通知绑定引擎224更新目标属性,反之亦然。当绑定数据到编辑框时双向绑定是特别有用的,其中该编辑框由编辑框中的用户产生的许多变化需要被传递到源数据值,作为双向绑定的另一个方案是,当另一个应用程序负责源数据字段时,那些变化反映在编辑框中。
当绑定类型262被指定为一次性时,发信号通知绑定引擎224立刻初始化目标属性,然后将它维持不变,即使相联系的源数据值被改变。当一些目标属性需要从源字段被初始化为一些值并且该数据内容不能预先知道时,该一次性绑定类型是有用的。另外,一次性绑定类型作为没有改变的源数据值的只读使用是有用的。如果数据源不支持本发明的属性通知机制(例如,IPropertychange),被指定为单向的目标属性将被同样地更新,正如作为绑定类型被指定为一次性的绑定。
另外一个绑定属性(以下称作更新类型264)为绑定类型262被指定为双向的情况定义一个更新类型。典型地,双向绑定得知目标属性中的变化并且将这些变化传递回源数据值。这个过程被称作更新源数据。通常地,希望随时能够更新目标属性的变化。然而,在某些情况下,每次击键后更新浪费周期并且拒绝用户用于更正打字错误的机会,等等。当更新将要发生时,允许用户指定更新类型264。在一个实施例中,更新类型264可以被指定为立即更新,失去光标时更新,和明确更新。在每次改变目标属性后,指定“立即更新”发信号通知绑定引擎更新源数据值。在目标单元失去键盘光标后,指定“失去光标时更新”发信号通知绑定引擎更新源数据值。只有当应用程序明确地要求更新时,指定“明确更新”发信号通知绑定引擎更新源数据值。典型地,这种Explicit请求通过一种方法而被执行。即使这种方法可能被调用用于任何更新类型264的设置,当更新类型被设置为明确更新时该方法是可用的。一个代表性的方法如下所示Binding.GetBinding(myElement,myProperty).Update();.
另外的一个绑定属性(以下称作源266)为绑定确定源数据项。简单地,结合图4中的说明和描述,源266可以被程序化地设置或具有标记。程序化地,开发者为对象提供一个绑定可以作为源数据项使用的对象裁决。简单地,结合图4详细地描述,在标记中有各种用于设置源属性的方法。
另外的一个绑定属性(以下称作转换器268)接收一个类引用。该类引用可以使用<Namespace>.<Class>,<Assembly>来指定。被指定的类引用由绑定引擎224调用以便将源数据值转换为目标属性接收的格式。类引用中的一个方法调用这个转换,如图2中的转换244所表示的。该类引用也可以指定一个逆转换(没有示出)用于将目标属性转换为源数据值接收的格式。该转换244可以支持用户界面语义学或可以是一个自定义类型的转换器。
另外的一个绑定属性(以下称作文化270)定义一个方法,在转换源数据值之前/之后,该方法中的源数据值被处理。文化270操作结合转换器268以便允许开发者为转换源数据值指定规则。例如,文化可以为数字,日期等等指定一个特定的格式。在一个实施例中,文化270接收文化信息类型的一个值。当执行该转换时,开发者具有通过文化270指定使用规则的选择权。
另外的一个绑定属性(以下称作绑定标志272)提供了一个用于接收发送信号通知传递数据的事件的机制。因为上述用于数据绑定的方法是异步的,所以绑定标志272允许开发者知道什么时候目标被更新为新值。为了使用这个机制,绑定标志272被设置为“NotifyOnTransfer”。然后管理者使用任何惯例方法记录事件。用于该机制一个代表性的使用如下<pre listing-type="program-listing"><![CDATA[  Public static void main()  {   //增加处理程序  elem.AddAttachedHandler(Binding.DataTranferEvent,  new DataTranferEventHandler(OnDataTransfer),  RoutedEventArgs.EventStage.Direct);  //事件处理程序  private static void OnDataTransfer(Element e,  DataTransferEventArgs args)  {  DynamicProperty DP=args.DP;  v=e.GetValue(DP);  DoSomething(v);  }  source.field=“new value”;  }.]]></pre>如以上所示的实例代码,一旦OnDataTransfer事件被触发,开发者知道该动态属性被更新。因此,开发者随后可以使用目标值进行进一步的处理。
图3是根据本发明的一个实施例说明绑定机制的一个逻辑流程图。总的看来,该绑定机制执行操作来设置绑定(块302-306)然后执行相关的操作(块310-338)来改变目标属性中或绑定中被指定的源数据值。处理在块302继续执行。
在块302,基于在创建过程中指定的参数创建一个绑定对象。简单地,在创建过程中,用于绑定对象252的每一个属性(例如,图2中所示的属性260-272)可以被指定为一个参数。该绑定可以通过标记,程序化地,等等来创建。图4是说明用于创建一个绑定以及用于指定属性260-272的代表性的语法。每一个创建方法指定一个源数据项,源数据项中到数据值的一个路径,一个目标用户界面元素,和用户界面元素上的一个目标动态属性。虽然当前的流程图中没有示出,但是绑定对象的属性也可以在运行时间中被动态地修改,例如通过使用应用编程接口(APIs)。处理进入块306。
在块304,绑定被激活。在一个实施例中,一旦绑定引擎发现有足够的上下文用于绑定时该绑定被自动地激活,例如已经存在源对象,目标元素准备好显示,等等。绑定引擎负责识别绑定的激活。处理在块304继续执行。
在块306,找到一个用于指定源属性的值。在一个实施例中,反映被用于寻找该值。反映是一个普通的机制,该机制允许调用程序获得关于被请求对象的信息。该信息包括被支持的对象,公共属性,等等。在另一个实施例中,当数据项为一个集合时,绑定引擎执行多个探索性的方法来决定是否使用当前的记录或数据对象(集合)本身。当该绑定涉及属性或索引时,应用第一个探索性的方法。在这种情况下,如果该属性或索引存在,集合对象上相应的属性或索引被使用。可选地,集合当前的记录作为数据项使用。当不存在属性或索引时应用另一个探索性的方法。在这种情况下,只要集合对象有效,该集合对象作为目标属性被使用。否则,使用当前的记录。在继续执行块308之前,如果绑定指定一个转换(块307),将转换应用到该值。下面结合块316详细地描述该转换的应用程序。处理在块308继续执行。
在块308,被找到的值分配给目标属性。在一个实施例中,负责维护属性级别的属性引擎可以分配该值。在另一个实施例中,在绑定的创建过程中指定的转换可以被调用,以便在将该值分配给目标属性之前转换该值。在进一步的改进中,属性引擎可以将属性标记为具有一个新值。一旦块302-308被执行,绑定引擎准备好按照需要更新目标属性和源数据值。通常,该结合机制是异步的。
因此,从块308,处理通过两个异步路径继续执行。第一个路径(块310-318)与更新目标属性相联系而第二个路径(块330-338)与更新源数据值相联系。每一个路径在下面被描述。首先,讨论负责更新目标属性的路径。
在判定块310,绑定引擎决定与源数据值和目标属性相联系的绑定是否被指定为一次性绑定类型。如果该绑定类型是一次性的,处理完成该绑定并且转到结束。本领域的技术人员将认识到,如果该绑定类型是一次性的,绑定引擎不得知源属性的改变事件。因此,在实际操作中,绑定引擎中的逻辑没有必要执行检测,如块310中所示。另外,如果数据项不执行IPropertychange,处理结束。然而,如果绑定类型不是一次性的,处理在块312继续执行。
在块312,绑定引擎得知与绑定相关联的通知。因为数据绑定不直接更新具有源数据值的目标,本发明执行一个通知机制。通知机制,例如属性变化通知和集合视图“CurrentChanged”通知等等,在现有技术中是公知的因此在这里不需要长篇地讨论。不同的操作引起一个通知,例如数据值的改变,页的导航,停机,数据集合中兴趣记录的改变,等等。因为发明在数据集合中兴趣记录的变化时引发一个更新,本发明提供了一个用于进一步分离用户界面和逻辑的方便的机制。例如,根据本发明,开发者只需要在逻辑中写入代码来指定如何改变数据集合中的下一条兴趣记录。一旦发生变化,根据本发明,绑定引擎将根据已经指定的绑定来更新用户界面。如前面所提到的,这种用户界面和逻辑的分离提供了一个比当用户界面和逻辑编结在一起时更强大和更容易维护的应用程序。
下面的代码是用于通知机制的一个代表性的执行过程。虽然下面编写的代表性的代码是在C语言中编写的,本领域的技术人员将认识到可以使用各种语言和语法执行该通知机制。对于任何这样的执行过程,通过每个数据项为用户定义一个界面。每一个数据项继承这个界面以便实施动态地更新。
Public interface IPropertyChange{event PropertyChangedEventHandler PropertyChanged;}.
接下来,定义事件处理程序及其参数public delegate void PropertyChangedEventHandler(objectsender,PropertyChangedEventArgs e);public class PropertyChangedEventArgsEventArgs
{public virtual string PropertyName{get;}}.
该PropertyChangedEventArgs类包括一个命名为PropertyName具有一个类型串的只读属性。该PropertyName属性包括一个用于被改变属性的名字。每当界面的一个属性被改变时,每一个源数据项则通过调用PropertyChanged代表来执行这个界面。下面是根据作为通知机制的实施例用于执行一个源对象(例如,数据项232)的一个说明性的例子。
<pre listing-type="program-listing"><![CDATA[  public class myClassIPropertyChange  {  private string foo=“Hello World”;  public string Foo  {  get{return foo;}  set{if(foo!=value)  {  foo=value;  NotifyPropertyChanged(“foo”);  }  }  public event PropertyChangedEventHandler Property  Changed;  private void NotifyPropertyChanged(string propName)  {  PropertyChanged(this,new  PropertyChangedEventArgs(propName));  }  }.]]></pre>如以上代表性的代码中所示的,用于‘foo’属性的‘set’方法判断新值是否与旧值不同。如果该值不同,处理程序被调用。执行反映来获得PropertyInfo。在进一步的改进中,一旦通过反映获得属性类型,绑定引擎可以存储该属性的类型。因此,一旦执行反映,并不是每一次为属性接收一个通知。在另外的一个改进中,空串可以被传递到自变量中以便发信号通知所有的绑定来更新每一个数据项的数据值。当源对象不确定有关发生改变的属性时这种情况可能发生,并且更新每个绑定。一旦绑定引擎接收一个有关源数据值发生变化的通知,处理在判决块314继续执行。
在判决块314,创建一个绑定是否与被改变的源数据值相联系的决定并为绑定指定一个转换。如果绑定没有指定一个转换,处理在块318继续执行。然而,如果绑定指定了一个转换,处理在块316继续执行。
在块316,执行绑定中被指定的转换。在一个实施例中,转换器268是一个如下描述的对象Public interface IDataTransformer{Public object Transform(object o,DynamicProperty dp,Cultureinfo c){;}}.
对于上述的界面,o代表源值,dp代表动态目标属性,以及c代表在转换过程中使用的文化。Transform()方法将源值o转换成一个适合分配类型dp的动态属性的对象。当将数据值从绑定的源传递到目标属性时Transform()方法被调用。如果Transform()方法返回一个空值,发信号通知绑定引擎停止值的传递。
转换器也可以基于在绑定中被指定的相关源数据值用于控制其他用户界面属性,例如宽度,高度,字体,定位(x,y),等等。为了用各种方法显示数据,转换器提供了在数据值上执行逻辑的能力。在一个进一步的改进中,文化可以应用在绑定中所指定的转换过程中。处理在块318继续执行。
在块318,目标属性被更新。在一个实施例中,属性引擎将值分配到目标属性。另外,目标属性可以被标记为具有一个新值。然后处理可以继续执行到块312并且侦听下一个与绑定相联系的属性变化通知。一旦应用程序结束或绑定被终止,处理转到结束。
如上所述,从块308,处理可以通过第二个路径继续执行。因此,从块308,处理在判决块330继续执行。如上所述关于判决块310,在判决块310的执行过程中,绑定引擎中的逻辑可以不必执行绑定类型的检测,而且,因为在绑定被创建的时候,绑定引擎没有被告知要侦听通知,所以处理不能通过第二路径流动。然而,为了清楚地描述该流程,判决块反映的结合类型被示出。因此,在判决块330,创建一个绑定是否被指定为双向绑定类型的决定。如先前讨论的,双向绑定允许目标属性中的变化被传递到源数据值。如果绑定不指定为双向绑定类型,处理转到结束。然而,如果绑定指定为双向绑定类型,处理在块332继续执行。
在块332,绑定引擎将识别某些触发更新源数据值的行为。一旦发生触发,处理在判决块334继续执行。
在判决块334,创建一个绑定是否为绑定指定一个反转换的决定。如果绑定不指定一个反转换,处理在块338继续执行。然而,如果绑定指定一个反转换,处理在块336继续执行。
在块336,反转换应用于源属性。在一个实施例中,反转换器是一个如下描述的对象Public interface IDataTransformer{Public object InverseTransform(object o,PropertyInfo pinfo,CultureInfo c){;}}.
对于上述的界面,o代表源值,c代表在转换过程中使用的文化,以及pinfo代表目标属性的PropertyInfo。InverseTransform()方法将源值o转换成一个适于分配类型信息的属性的对象。当从绑定的目标将值传递到源时这个方法被调用。如果InverseTransform()方法返回一个空值,绑定引擎不传递值。一旦InverseTransform被执行,处理在块338继续执行。
在块338,根据更新类型更新源属性。如上所述,更新类型可以是立即更新,失去光标时更新,明确更新,以及其他类型。一旦源属性被更新,处理转到结束。
图4说明了用于创建一个绑定的几个代表性的方法。创建方法400-410通过标记创建绑定。创建方法410通过代码创建绑定。图4中所示的说明性的方法不是穷举的。在不脱离本发明范围的情况下,可以使用其他方法(语法)。
创建方法400包括一个用于单元424的DataContext名/值对(以下称作DataContext 422)和Id名/值对(以下称作Id420)。因为创建方法400也包括DataContext 422,所以Id 420是不必要的。当想要涉及一个确切源时需要Id420,例如提示中ElementSource的使用或代码中IdObjectReg的使用。所有这些使用在下面被描述。DataContext 422是在单元(例如,单元424)上定义的一个动态属性。与DataContext422相关的值表示默认源数据项并且是一个可继承的属性。当为单元424和派生的单元(例如,按钮单元426)创建一个绑定时,绑定引擎查询DataContext 422并且利用DataContext 422。绑定引擎也得知DataContext 422的变化,从而触发一个更新。因此,虽然没有被要求,但是DataContext 422为所有限制普通数据项的属性提供一个用于确定范围的方便的机制。子单元可以具有他们自己的DataContext,它将比父单元的DataContext 422优先。绑定可以通过提供一个非空的源来覆盖DataContext 422,结合创建方法402在下面描述。
结合目标属性说明按钮单元426(例如,Button.Text428)。根据本发明,根据遇到的“Data:Bind”,绑定引擎识别被指定的绑定。名/值对遵循照图2中所指定的设置绑定属性267-272。本领域的技术人员将认识到,用于发信号通知绑定的术语“Data:Bind”是随意的一个术语,在不脱离本发明范围的情况下可以使用许多术语。创建方法400表示详细的标记格式。
创建方法402表示紧凑的提示格式。用户界面属性(例如,Button Text)在一个更紧凑的方式中被表示。此外,“Data:Bind”作为绑定引擎的一个信号而被使用,所述绑定引擎紧随一个绑定。同样,在相应于想要的属性260-272的Data:Bind之后的名/值对已经作为绑定对象250在图2中被早先描述。例如,ElementSource名/值对(以下称作ElementSource 434)相应于源266。
在标记中,有两种用于设置源属性的方法ElementSource和DataSource。如果两者都不被使用,作为源的默认值为空,其发信号通知绑定引擎在创建时获得单元的DataContext属性的值并且作为源对象而使用该值。
当创建方法(例如,创建方法402)指定一个ElementSource,绑定引擎找到该单元,该单元的ID由ElementSource属性指定。然后那个单元的DataContext作为源对象被使用。相关的路径名,例如/Parent/Parent和/Previous/Previous,可以用来指定数据源。当绑定引擎遇到/Parent时,绑定引擎根据对象层次寻找当前单元的父单元。例如,如果该单元是一个客户订单,指定/Parent可以发信号通知绑定引擎寻找与客户相应的该单元作为当前的订单。指定/Parent在嵌套转发器情况下是有用的,在该情况下想要在内部转发器的范围内使用从外部转发器输出的值。指定/Previous发信号通知绑定引擎在转发器中寻找当前单元之前的单元。当想要访问除了当前项以外的当前的n项时,指定/Previous是有用的,例如在线图中等等。根据本发明可以使用连续的/Previous和/Parent。
在另一个实施例中,提示可以指定一个DataSource。当指定DataSource时,绑定引擎接收资源的资源标识符。如果该资源显露出数据属性,则绑定引擎将设置绑定的源到对象,该对象由DataSource资源的数据属性返回。否则,绑定引擎将绑定的源设置到资源对象本身。
本领域的技术人员将认识到,属性260-272中有多种方法可以使用标记语言表示,因此,可以使用标记语言表示每个其他属性的方式,在这里不作进一步详细地解释。
以下的三个创建方法404-410在本发明可以绑定的项目的类型上提供了说明性的例子。创建方法404说明了支持绑定到子属性和索引。与绑定相应的创建方法404用C语言编写如di.a.b[3].c,其中di是相关的数据项。在数据项,类执行di.a的时候,执行di.a b的类和执行di.a b[3].c的类都支持本发明的通知机制(例如,IPropertyChange)并且通知什么时候他们的属性改变,被指定的绑定使用创建方法404使绑定引擎自动更新限制属性(例如,目标属性)以便反映源数据值中的变化。
创建方法406说明了支持绑定到数据集合。绑定引擎将自动使用集合在每一层的当前记录(其中a,b,和c表示不同的层)。例如,如果di.a具有一个IDataCollection类型,绑定使用集合当前的记录以便获得“b”属性。因此,每当前记录被改变时,绑定引擎自动更新与数据集合相联系的值。
创建方法408说明了支持绑定到XML节点。到该值的路径260使用一个x路径表达式来维护,例如“/Customer/Order[@OrderID=10]/Amount)”,如图4中所示。创建方法410说明了绑定到ADO数据表的支持。对于这个执行过程,到该值的路径260作为用于特定行的域名被维护,例如“OrderID”,如图4中所示。
创建方法410创建可编程控制地绑定。开发者为对象提供了一个对象参考,该绑定将作为源数据项使用。创建方法412中显示的程序语句创建一个与创建方法410所说明的相同行为的绑定。SetBinding方法具有许多更精细的变量,通过该变量程序师可以指定上面讨论的任何绑定属性。上面简单的例子使用按钮的DataContext作为源对象。下面的程序语句创建一个单向的绑定,该绑定使用特定的对象(在运行时间中所知道的)作为源对象源=…一些任意的对象…;Binding.SetBinding(myButton,Element.BackgroundProperty,“Color”,BindType.OneWay,new ExplicitObjectRef(source));下面的实例代码显示了一个通过本发明的绑定机制用数据控制用户界面属性的执行过程。在这个例子当中,数据值(例如,myInteger)和用户界面属性(例如,TextContent)作为一个绑定而被激活。另外,为这个绑定指定一个转换(例如,MyTranformer)。
<pre listing-type="program-listing"><![CDATA[  <Test TextContent=“*Data:Bind(Path=myInteger)”  Foreground=“*Data:Bind(Path=MyInteger;  Transformer=MyTransformer)”/>  public class MyTransformer:IDataTransformer  {  public object Transform(object o,DynamicProperty dp,  CultureInfo culture)  {  if((int)o<0)return Red;  else return Black;  }  public object InverseTransform(object o,PropertyInfo info,  CultureInfo culture)  {  return null;  }  }.]]></pre>因此,作为描述,本发明提供了一个用于将源数据值与目标属性相关联的机制,如此在用户界面和逻辑中的译码的改变可以被分离。因此,本发明允许开发者容易地改变以及增强用户界面而不需要它们改变应用程序的下层逻辑。
上面的说明,例子和数据提供了一个生产和使用本发明的成分的完整的描述。因为在不脱离本发明的精神和范围的情况下本发明的许多实施例可以被实施,本发明归属于以下所附的权利要求所限定的范围。
权利要求
1.一种计算机可读介质,其具有用数据控制用户界面属性的计算机可执行指令,该指令包括创建一个将目标属性与源数据值关联的绑定;以及在接收一个源数据值已经历改变的通知时,基于该绑定在目标属性中反映该改变。
2.权利要求1的计算机可读介质,其中该目标属性包括一个用户界面属性。
3.权利要求1的计算机可读介质,进一步包括在目标属性中该反映变化之前将一个转变应用到源数据值。
4.权利要求1的计算机可读介质,其中创建绑定包括为绑定指定一个绑定类型。
5.权利要求4的计算机可读介质,其中该绑定类型包括一个第一绑定类型,当该绑定被激活的时候,该第一绑定类型导致基于源数据值而更新该目标属性。
6.权利要求4的计算机可读介质,其中该绑定类型包括一个第二绑定类型,当源数据值经历变化时,该第二绑定类型导致目标属性被更新。
7.权利要求1的计算机可读介质,进一步包括随着目标属性的目标变化更新源数据值。
8.权利要求7的计算机可读介质,其中更新源数据值几乎立即在目标改变之后被异步地执行。
9.权利要求7的计算机可读介质,其中当目标属性失去光标时更新源数据值被异步地执行。
10.权利要求7的计算机可读介质,其中更新源数据值由一个应用程序明确地执行。
11.权利要求1的计算机可读介质,其中创建绑定用代码指定。
12.权利要求1的计算机可读介质,其中创建绑定用标记语言指定。
13.权利要求1的计算机可读介质,进一步包括创建另外一个绑定,该绑定将目标属性与另一个源数据值相关联。
14.权利要求1的计算机可读介质,其中源数据值与数据源相关联。
15.权利要求14的计算机可读介质,其中数据源通过XML上的X路径、ADO中的列、和反射中的一个来指定。
16.一种计算机系统,其用数据控制用户界面属性,该计算机系统包括处理器;以及存储器,该存储器被分配用于多个计算机可执行指令,该计算机可执行指令被装载到存储器中用于由处理器执行,该计算机可执行指令执行一种方法,包括创建绑定,该绑定将目标属性与一个源数据值相关联;以及在接收一个该源数据值已经历一个变化的通知时,基于该绑定在目标属性中反映该变化。
17.权利要求16的计算机系统,其中目标属性包括一个用户界面属性。
18.权利要求16的计算机系统,进一步包括在目标属性中反映该变化之前将一个转变应用到源数据值。
19.权利要求16的计算机系统,其中创建绑定包括为该绑定指定一个绑定类型。
20.权利要求19的计算机系统,其中该绑定类型包括一个第一绑定类型,当该绑定被激活的时候,该第一绑定类型导致基于源数据值更新目标属性。
21.权利要求19的计算机系统,其中该绑定类型包括一个第二绑定类型,当源数据值经历变化时,该第二绑定类型导致目标属性被更新。
22.权利要求16的计算机系统,进一步包括随着目标属性的目标变化更新源数据值。
23.权利要求22的计算机系统,其中更新源数据值几乎立即在目标改变之后被异步地执行。
24.权利要求22的计算机系统,其中当目标属性失去光标时更新源数据值被异步地执行。
25.权利要求22的计算机系统,其中更新源数据值由一个应用程序明确地执行。
26.权利要求16的计算机系统,其中创建绑定用代码指定。
27.权利要求16的计算机系统,其中创建绑定用标记语言指定创建的绑定。
28.一种计算机可读介质,其具有用数据控制用户界面属性的计算机可执行指令,该指令包括一个逻辑部分,用于操纵应用程序中的数据值;一个应用程序中的用户界面部分,该用户界面部分负责显示用户界面属性,该用户界面部分与逻辑部分相独立;以及至少一个绑定规范,该绑定规范描述了用户界面属性与数据值之间的关系以至于当数据值经历变化时通知系统级别代码,以至于系统级别代码可以指导用户界面部分来反映用户界面属性中的变化。
29.权利要求28的计算机可读介质,其中使用代码指定绑定规范。
30.权利要求28的计算机可读介质,其中使用标记语言指定绑定规范。
31.权利要求28的计算机可读介质,其中绑定规范确定一个源数据项、一个到源数据项中数据值的路径、一个目标用户界面元素、和目标用户界面元素上的用户界面属性。
32.权利要求31的计算机可读介质,其中该绑定规范进一步确定一个转换,在用户界面属性中反映所述变化之前将该转换应用于数据值。
33.权利要求31的计算机可读介质,其中该绑定规范进一步为绑定确定一个绑定类型。
34.权利要求33的计算机可读介质,其中该绑定类型包括一个第一绑定类型,当该绑定被激活时,该第一绑定类型导致基于数据值更新用户界面属性。
35.权利要求33的计算机可读介质,其中该绑定类型包括一个第二绑定类型,当数据值经历变化时,该第二绑定类型导致用户界面属性被更新。
36.权利要求31的计算机可读介质,其中绑定规范进一步指定当用户界面属性经历一个用户界面改变时,数据值被更新。
37.权利要求36的计算机可读介质,其中在用户界面改变之后,数据值几乎立即被异步地更新。
38.权利要求36的计算机可读介质,其中当用户界面属性失去光标时,数据值被异步地更新。
全文摘要
本发明描述了一个用数据控制用户界面(UI)属性的系统和方法。一个应用程序被分为独立的部分,一个逻辑部分和一个用户界面部分。逻辑部分操作应用程序中的数据值。用户界面部分负责显示用户界面属性。一个绑定规范描述了用户界面属性与数据值之间的关系。当数据值经历变化时,系统级别代码使用该绑定规范来决定被通知的方式以及决定指导用户界面部分反映用户界面属性中的变化的方式。该绑定规范确定一个源数据项,源数据项中到数据值的一个路径,一个目标用户界面元素,和该目标用户元素上的用户界面属性。可以使用代码或标记语言指定该绑定。
文档编号G06F13/00GK1620655SQ03801953
公开日2005年5月25日 申请日期2003年5月17日 优先权日2003年5月17日
发明者S·W·本特, N·库普塔, D·J·杰尼, A·I·豪普曼 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1