week 9
1.当你的窗体中绑定了3个不同的数据源,数据绑定机制就会自动产生三个对应的BindingManagerBase的子对象 与数据源对象对应。其实更为准确的说法是,如果你的窗体绑定了三个不同的对象,那么就会产生三个独立的BindingManagerBase的子对象与其 对应。至于是产生PropertyManager还是CurrencyManager就要取决与你绑定的数据源是单一对象还是列表(集合)对象了。上图说 明了这一个点,如果是绑定的是单一对象就会产生PorpertyManager,而如果是列表(集合)对象就会产生一个CurrencyManager。
2. PropertyManager主要管理一组相关的Binding对象,而CurrencyManager主要管理着相应的对象集合(列表对象)。两个对 象管理的侧重点不同,一个主要管理数据绑定的基础对象Binding,而一个主要管理数据绑定的后端数据源对象集合。
比如CurrencyManager可以每次从集合对象中猎取一个对象然后将其绑定的到窗体控件中去,它也可以在集合对象中进行导航。或也可以新增新的对象集合中,等等。
3.因为对于同一窗体而言,可能绑定到多个数据源也就会产生多个“管理者”,而每一个数据源都会对应一个独立的“管理者”。所以我们可以通过窗体的BindingContext对象获得某个特定数据源对应的“管理者”。
使用 Binding 对象建立绑定,每个绑定通常都具有四个组件:绑定目标、目标属性、绑定源、要使用的源值的路径。 本节讨论如何设置绑定。
请看下面的示例,其中的绑定源对象是一个名为 MyData 的类,该类在 SDKSample 命名空间中定义。 出于演示的目的,MyData 类具有一个名为 ColorName 的字符串属性,该属性的值设置为“Red”。 因此,此示例生成一个具有红色背景的按钮。
<DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:SDKSample"> <DockPanel.Resources> <c:MyData x:Key="myDataSource"/> </DockPanel.Resources> <DockPanel.DataContext> <Binding Source="{StaticResource myDataSource}"/> </DockPanel.DataContext> <Button Background="{Binding Path=ColorName}" Width="150" Height="30">I am bound to be RED!</Button> </DockPanel>
有关绑定声明语法的详尽信息以及如何在代码中设置绑定的示例,请参见绑定声明概述。
如果将此示例应用于基本关系图,则生成的图如下所示。 这是一个 OneWay 绑定,因为 Background 属性在默认情况下支持 OneWay 绑定。
指定绑定源
请注意,在上一个示例中,绑定源是通过设置 DockPanel 元素上的 DataContext 属性来指定的。 Button 随后从 DockPanel(这是其父元素)继承 DataContext 值。 在这里重复一下,绑定源对象是绑定的四个必需组件之一。 因此,如果未指定绑定源对象,则绑定将没有任何作用。
可通过多种方法指定绑定源对象。 在将多个属性绑定到相同源时,可以使用父元素上的 DataContext 属性。 但是,在各个绑定声明上指定绑定源有时可能更为合适。 对于上一个示例,可以不使用DataContext 属性,而是通过在按钮的绑定声明上直接设置 Source 属性来指定绑定源,如下面的示例中所示:
<DockPanel.Resources> <c:MyData x:Key="myDataSource"/> </DockPanel.Resources> <Button Width="150" Height="30" Background="{Binding Source={StaticResource myDataSource}, Path=ColorName}">I am bound to be RED!</Button>
除了在元素上直接设置 DataContext 属性、从上级继承 DataContext 值(如第一个示例中的按钮)、通过设置 Binding 上的 Source 属性来显式指定绑定源(如最后一个示例中的按钮),还可以使用 ElementName 属性或 RelativeSource 属性指定绑定源。 当绑定到应用程序中的其他元素时(例如在使用滑块调整按钮的宽度时),ElementName 属性是很有用的。 当在ControlTemplate 或 Style 中指定绑定时,RelativeSource 属性是很有用的。 有关更多信息,请参见如何:指定绑定源。
指定值的路径
如果绑定源是一个对象,则可使用 Path 属性指定要用于绑定的值。 如果要绑定到 XML 数据,则可使用 XPath 属性指定该值。 在某些情况下,可以使用 Path 属性,即使在数据为 XML 时。 例如,如果要访问返回的 XmlNode(作为 XPath 查询的结果)的 Name 属性,则应使用 Path 属性和 XPath 属性。
有关语法信息和示例,请参见 Path 和 XPath 属性页。
请注意,虽然我们已强调要使用的值的 Path 是绑定的四个必需组件之一,但在要绑定到整个对象的情况下,要使用的值会与绑定源对象相同。 在这些情况下,不指定 Path 比较合适。 请看下面的示例:
<ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="true"/>
上面的示例使用空绑定语法:{Binding}。 在此情况下,ListBox 从父 DockPanel 元素继承 DataContext(此示例中未演示)。 当未指定路径时,默认为绑定到整个对象。 换句话说,在此示例中路径已被省略,因为要将 ItemsSource 属性绑定到整个对象。 (有关深入讨论,请参见绑定到集合一节。)
除了绑定到集合以外,在希望绑定到整个对象,而不是仅绑定到对象的单个属性时,也可以使用此方案。 例如,在源对象为类型字符串,并且您仅仅希望绑定到该字符串本身时。 另一种常见情况是您希望将一个元素绑定到具有多个属性的一个对象。