目录

1、实现属性更改通知

示例

2、双向绑定​​​更新源

示例

3、对分层数据使用主-从模式

示例

4、对分层 XML 数据使用主-从模式

示例

5、绑定两个控件的属性

示例

6、创建和绑定到 ObservableCollection

示例

7、使用 XMLDataProvider 和 XPath 查询绑定到 XML 数据

示例


1、实现属性更改通知

若要支持OneWay或TwoWay绑定,从而使绑定目标属性能够自动反映绑定源的动态更改。

示例

若要实现INotifyPropertyChanged,需要声明PropertyChanged事件并创建OnPropertyChanged方法。 然后,对于每个需要更改通知的属性,只要进行了更新,就可以调用OnPropertyChanged

using System.ComponentModel;using System.Runtime.CompilerServices;namespace SDKSample{// This class implements INotifyPropertyChanged// to support one-way and two-way bindings// (such that the UI element updates when the source// has been changed dynamically)public class Person : INotifyPropertyChanged{private string name;// Declare the eventpublic event PropertyChangedEventHandler PropertyChanged;public Person(){}public Person(string value){this.name = value;}public string PersonName{get { return name; }set{name = value;// Call OnPropertyChanged whenever the property is updatedOnPropertyChanged();}}// Create the OnPropertyChanged method to raise the event// The calling member's name will be used as the parameter.protected void OnPropertyChanged([CallerMemberName] string name = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}}}

2、双向绑定​​​更新源

本示例介绍了如何使用UpdateSourceTrigger属性控制绑定源更新的执行时间。 本主题使用TextBox控件作为示例。

示例

TextBox.Text属性的UpdateSourceTrigger默认值为LostFocus。 这意味着如果应用程序的TextBox包含数据绑定TextBox.Text属性,则直到TextBox失去焦点(例如,将鼠标移到TextBox外单击时),键入到TextBox中的文本才会更新源。

如果希望在键入过程中更新源,请将该绑定的PropertyChanged设置为UpdateSourceTrigger。 在下面的示例中,突出显示的代码行显示TextBox和TextBlock的Text属性都绑定到相同的源属性。TextBox绑定的UpdateSourceTrigger属性设置为PropertyChanged。

Joe

因此,TextBlock所显示的文本将与用户输入到TextBox中的文本相同(因为源发生更改),如该示例的以下屏幕快照所示:

如果拥有一个对话框或用户可编辑的窗体,并且希望将源更新延迟到用户完成字段编辑并单击“确定”之后,可以将绑定的UpdateSourceTrigger值设置为Explicit,如下面的示例所示:

如果将UpdateSourceTrigger值设置为Explicit,则仅当应用程序调用UpdateSource方法时,该源值才会发生更改。 下面的示例演示如何为itemNameTextBox调用UpdateSource:

// itemNameTextBox is an instance of a TextBoxBindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);be.UpdateSource();

备注

此方法也可用于其他控件的属性,但请记住,其他大多数属性的默认UpdateSourceTrigger值为PropertyChanged。

备注

UpdateSourceTrigger属性用于处理源更新,因此仅适用于TwoWay或OneWayToSource绑定。 若要使TwoWay和OneWayToSource绑定生效,源对象需要提供属性更改通知。

3、对分层数据使用主-从模式

此示例演示了如何实现大纲-详细信息方案。

示例

在此示例中,LeagueListLeagues的集合。 每个League都有一个Name和一个Divisions集合,每个Division都有一个名称和一个Teams集合。 每个Team都有一个团队名称。

下面是该示例的一个屏幕快照。DivisionsListBox自动跟踪LeaguesListBox中的所选项并显示相应的数据。TeamsListBox跟踪其他两个ListBox控件中的所选项。

备注

绑定目标属性(在本例中为Background属性)必须是一个依赖属性。

6、创建和绑定到 ObservableCollection

本示例演示如何创建和绑定到派生自”>ObservableCollection类的集合,该类是一个在添加或移除项时提供通知的集合类。

示例

下面的示例演示NameList集合的实现:

public class NameList : ObservableCollection{public NameList() : base(){Add(new PersonName("Willa", "Cather"));Add(new PersonName("Isak", "Dinesen"));Add(new PersonName("Victor", "Hugo"));Add(new PersonName("Jules", "Verne"));}}public class PersonName{private string firstName;private string lastName;public PersonName(string first, string last){this.firstName = first;this.lastName = last;}public string FirstName{get { return firstName; }set { firstName = value; }}public string LastName{get { return lastName; }set { lastName = value; }}}

可以根据使数据可用于 XAML 中的绑定
中的说明,按照与其他公共语言运行时 (CLR) 对象相同的方式使集合可用于绑定。 例如,可以在 XAML 中实例化该集合,并将该集合指定为一个资源,如下所示:

...

然后可以绑定到该集合:

此处没有显示NameItemTemplate的定义。

备注

集合中的对象必须满足
绑定源概述中所述的要求。 特别是,如果使用OneWay或TwoWay(例如,希望 UI 在源属性发生显著变化时进行更新),则必须实现一个适当的“属性已更改”通知机制,如INotifyPropertyChanged接口。

7、使用 XMLDataProvider 和 XPath 查询绑定到 XML 数据

此示例介绍如何使用XmlDataProvider绑定到 XML 数据。

使用XmlDataProvider,在应用程序中可通过数据绑定访问的基础数据可以是 XML 节点的任意树。 也就是说,XmlDataProvider提供一种将 XML 节点的任意树用作绑定源的简便方式。

示例

在以下示例中,数据作为 XML 数据岛直接嵌入Resources部分。 XML 数据岛必须包装在标记中,并始终具有一个单一根节点,在本示例中根节点为 Inventory。

备注

XML 数据的根节点具有一个将 XML 命名空间设置为空字符串的 xmlns 属性。 将 XPath 查询应用到 XAML 页中内联的数据岛时,需要此属性。 在此内联情况下,XAML 以及数据岛会继承System.Windows命名空间。 因此,需要将命名空间设置为空白,以防止 XPath 查询被System.Windows命名空间限定而误导查询。

XML in ActionXML Web TechnologyProgramming Microsoft Windows With C#C# Programming using the .NET FrameworkInside C#C# Language ProgrammingIntroducing Microsoft .NETOverview of .NET TechnologyMicrosoft C# Language SpecificationsThe C# language definitionClassical CollectionClassical MusicJazz CollectionJazz MusicXML Data Source Sample=8 or @Number=3]"/><!--\=8 or @Number\=3]}">-->

如此示例中所示,若要使用属性语法创建相同的绑定声明,必须对特殊字符进行正确转义。

运行此示例时,ListBox将显示以下项。 这些项为Books下所有元素的Title,其中Stock值为“out”,Number值为 3 或者大于或等于 8。 请注意,没有返回任何 CD 项,因为XmlDataProvider上设置的XPath值表示只应公开 Books 元素(本质上是设置筛选器)。

xpath-example-listbox-details.png

此示例显示书名,因为DataTemplate中的TextBlock绑定的XPath设为“Title”。 如果希望显示属性值,如 ISBN,则应将XPath值设置为“@ISBN”。

WPF 中的 XPath 属性使用 XmlNode.SelectNodes 方法处理。 可以修改XPath查询以获取不同的结果。 以下是上一示例中对绑定ListBox执行XPath查询的部分示例:

  • XPath="Book[1]"将返回第一个 Book 元素(“XML in Action”)。 请注意,XPath索引从 1 而不是从 0 开始。

  • XPath="Book[@*]"将返回带有任意属性的所有 Book 元素。

  • XPath="Book[last()-1]"将返回第二个至最后一个 Book 元素(“Introducing Microsoft .NET”)。

  • XPath="*[position()>3]"将返回除前 3 个元素之外的所有 Book 元素。

当运行 XPath 查询时,它将返回XmlNode或 XmlNode 列表。XmlNode是公共语言运行时 (CLR) 对象,这意味着可以使用Path属性绑定到公共语言运行时 (CLR) 属性。 再以上述示例为例。 如果该示例的其余部分保持不变,将TextBlock绑定更改为下面的值,则将在ListBox中看到返回的 XmlNode 的名称。 在此情况下,所有返回节点的名称为“Book”。

在某些应用程序中,将 XML 作为 XAML 页的源内的数据岛嵌入可能很不方便,因为在编译时必须知道该数据的确切内容。 因此,还支持从外部 XML 文件获取该数据,如下面的示例所示:

如果 XML 数据驻留在远程 XML 文件中,可以通过将适当的 URL 分配给Source属性来定义对该数据的访问,如下所示: