在本文中

  • 先决条件
  • 将控件绑定到单个项目
  • 将控件绑定到对象的集合
  • 通过使用数据模板显示控件中的项目
  • 添加详细信息视图
  • 转换数据以在控件中显示
  • 相关主题

本主题介绍了如何在使用 C++、C# 或 Visual Basic 的 Windows 应用商店应用中将控件绑定到单个项或将列表控件绑定到项目集合。此外,本主题向你介绍了如何自定义控件项目的显示、如何基于所选内容实现详细信息视图,以及如何转换数据以进行显示。有关更多详细信息,请参阅使用 XAML 进行数据绑定。

路线图: 本主题与其他主题有何关联?请参阅:

  • 使用 C# 或 Visual Basic 的 Windows 运行时应用的路线图
  • 使用 C++ 的 Windows 运行时应用的路线图

先决条件

本主题假定你可以使用 Microsoft Visual Basic、Microsoft Visual C# 或 Microsoft Visual C++ 创建基本 Windows 运行时应用。有关创建你的第一个 Windows 运行时应用的说明,请参阅使用 C# 或 Visual Basic 创建你的第一个 Windows 应用商店应用。

将控件绑定到单个项目

数据绑定包括一个目标和一个源。目标通常是控件的属性,源通常是数据对象的属性。有关目标和源要求的信息,请参阅使用 XAML 进行数据绑定。

下面是将控件绑定到单个项目的一个示例。目标是文本框控件的 Text 属性。源是一个简单的音乐 Recording类。

XAML
<Grid x:Name="LayoutRoot" Background="#FF0C0C0C"><TextBox x:Name="textBox1" Text="{Binding}" FontSize="30"Height="120" Width="440" IsReadOnly="True"TextWrapping="Wrap" AcceptsReturn="True" />
</Grid>

C#
VB

// Constructor
public MainPage()
{InitializeComponent();// Set the data context to a new Recording.textBox1.DataContext = new Recording("Chris Sells", "Chris Sells Live",new DateTime(2008, 2, 5));
}// A simple business object
public class Recording
{public Recording() { }public Recording(string artistName, string cdName, DateTime release){Artist = artistName;Name = cdName;ReleaseDate = release;}public string Artist { get; set; }public string Name { get; set; }public DateTime ReleaseDate { get; set; }// Override the ToString method.public override string ToString(){return Name + " by " + Artist + ", Released: " + ReleaseDate.ToString("d");}
}

上述代码会产生类似下图的输出。

若要在文本框中显示音乐录音,请通过使用标记扩展将控件的 Text 属性设置为 Binding。在此示例中,默认情况下 Mode 是 OneWay,这意味着数据是从源检索的,但不会将更改传播回到源。

Recording 类有三个公共属性和一个 ToString 方法重写。这三个属性是 ArtistName 和ReleaseDateToString 方法很重要,因为如果未指定任何格式,会出于显示目的在绑定对象上调用 ToString方法。该绑定的 Binding.Source 属性不是直接设置的,而是将 TextBox 控件的 DataContext 属性设置为一个新的 Recording 对象。

将控件绑定到对象的集合

上一个示例展示了用于将数据绑定到控件的语法,但这不是很实际。一个更常见的情形是绑定到业务对象的集合。在 C# 和 Visual Basic 中,通用 ObservableCollection<T> 类是数据绑定的一个很好的集合选择,因为它实现INotifyPropertyChanged 和 INotifyCollectionChanged 接口。当列表中的项目改变时,或列表本身的属性改变时,这些接口向绑定控件提供更改通知。如果你希望你的绑定控件使用集合中的对象属性更改进行更新,则业务对象也应该实现 INotifyPropertyChanged。 有关在 C++ 中进行绑定的信息,请参阅使用 XAML 进行数据绑定。

以下示例将音乐 Recording 对象集合绑定到 ComboBox。若要尝试此示例,请单击组合框中的向下箭头,以查看绑定录音列表。

XAML
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"><ComboBox x:Name="ComboBox1" ItemsSource="{Binding}"Foreground="Black" FontSize="30" Height="50" Width="780"/>
</Grid>

C#
VB

public ObservableCollection<Recording> MyMusic = new ObservableCollection<Recording>();public Page()
{InitializeComponent();// Add items to the collection.MyMusic.Add(new Recording("Chris Sells", "Chris Sells Live",new DateTime(2008, 2, 5)));MyMusic.Add(new Recording("Luka Abrus","The Road to Redmond", new DateTime(2007, 4, 3)));MyMusic.Add(new Recording("Jim Hance","The Best of Jim Hance", new DateTime(2007, 2, 6)));// Set the data context for the combo box.ComboBox1.DataContext = MyMusic;
}

上述代码会产生类似下图的输出。

若要显示 ComboBox 中的音乐录音,则将该控件的 ItemsSource 属性设置为 Binding,并将 ComboBox 控件的 DataContext 属性设置为 Recording 对象的集合,该集合为绑定提供源。针对集合中的每个项都创建了一个 ComboBoxItem。针对每个 Recording 对象将自动调用 ToString,以在组合框项中显示该对象。

通过使用数据模板显示控件中的项目

你可以通过使用项目的 ToString 方法显示列表中的项目。但是,一种更常见的情形是通过使用 DataTemplate来提供数据绑定项目的自定义显示。使用 DataTemplate,可以自定义在控件中显示列表项的方式。通常,通过使用内容控件的 ContentTemplate 属性或项控件的 ItemTemplate 属性来设置数据模板。

以下示例显示了通过使用数据模板绑定到某个组合框的相同录音列表。组合框是 ItemsControl,这意味着通过将每个项目的 ItemTemplate 属性设置为一个数据模板来为每个项目建立数据模板。若要尝试此示例,请单击向下箭头,以查看录音列表。请注意这些录音与上一示例有何不同。在自定义格式中会显示艺术家和 CD 名称。

XAML
<ComboBox x:Name="ComboBox1" ItemsSource="{Binding}"Foreground="Black" FontSize="30" Height="50" Width="450"><ComboBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal" Margin="2"><TextBlock Text="Artist:" Margin="2" /><TextBlock Text="{Binding Artist}" Margin="2" /><TextBlock Text="CD:" Margin="10,2,0,2" /><TextBlock Text="{Binding Name}" Margin="2" /></StackPanel></DataTemplate></ComboBox.ItemTemplate>
</ComboBox>

上述代码会产生类似下图的输出。

在 XAML 中,你可以看到数据模板定义。数据模板包含一个带有四个 TextBlock 控件的 StackPanel。堆叠面板具有一个水平方向,这样四个文本块控件会并排显示。其中两个 TextBlock 控件绑定到 Recording 对象的 Artist 和 Name 属性。另外两个 TextBlock 控件显示静态文本。对于每个绑定项,该绑定提供到 Recording 对象上的属性的路径。如上一示例中所示,该绑定依赖于要设置为录音列表的数据上下文。

此 XAML 使用属性元素语法。有关 XAML 语法的详细信息,请参阅快速入门:使用 XAML 创建用户界面。有关控件布局的详细信息,请参阅快速入门:定义布局。

添加详细信息视图

从集合中选择项目时,要显示项目的详细信息,你必须创建相应的 UI 并将该 UI 绑定到你希望其显示的数据。此外,必须将 CollectionViewSource 用作数据上下文以使详细信息视图能够绑定到当前项。

以下示例显示了相同的录音列表,但这次该列表是某个 CollectionViewSource 实例的数据源。会将整个页面或用户控件的数据上下文设置为集合视图源,且组合框和详细信息视图会继承数据上下文。这使得组合框绑定到集合并且能够显示相同的项列表,同时详细信息视图会自动绑定到当前项。详细信息视图不需要明确绑定到当前项,因为集合视图源自动提供数据的相应级别。

若要尝试此示例,请单击向下箭头,并选择不同的录音。请注意,艺术家、CD 名称和发布日期会显示在详细信息视图中的相应组合框下方。

XAML
<!--The UI for the details view-->
<StackPanel x:Name="RecordingDetails"><TextBlock Text="{Binding Artist}" FontWeight="Bold" FontSize="30" /><TextBlock Text="{Binding Name}" FontStyle="Italic" FontSize="30" /><TextBlock Text="{Binding ReleaseDate}" FontSize="30" />
</StackPanel>

C#
VB

// Set the DataContext on the parent object instead of the ComboBox
// so that both the ComboBox and details view can inherit it.
// ComboBox1.DataContext = MyMusic;
this.DataContext = new CollectionViewSource { Source = MyMusic };

上述代码会产生类似下图的输出。

在此示例中,将向包含现有组合框的用户控件中添加一个 StackPanel。接下来是包含用于显示录音详细信息的三个文本块的一个堆叠面板。每个文本块的 Text 属性将绑定到 Recording 对象上的某个属性。

转换数据以在控件中显示

如果需要在控件中设置某个非字符串类型(如 TextBox)的格式并显示该类型,则可以使用转换器。例如,你可以显示一个标签和一个已设置格式的日期,而不是仅显示该日期。

以下示例将展示在录音列表中发布日期的某个转换器实现。若要尝试此示例,请单击向下箭头,并选择不同的录音。请注意,下拉列表和详细信息视图中的发布日期会以自定义格式显示。

XAML
<UserControl x:Class="TestDataBindingQS.Page2"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="using:TestDataBindingQS"mc:Ignorable="d"d:DesignHeight="768" d:DesignWidth="1366"><UserControl.Resources><local:StringFormatter x:Key="StringConverter"/></UserControl.Resources><Grid x:Name="LayoutRoot" Background="#FF0C0C0C"><StackPanel Width="750" Height="200"VerticalAlignment="Center" HorizontalAlignment="Center"><ComboBox x:Name="ComboBox1" ItemsSource="{Binding}" Foreground="Black" FontSize="30" Height="50" Width="750"><ComboBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal" Margin="2"><TextBlock Text="Artist:" Margin="2" /><TextBlock Text="{Binding Artist}" Margin="2" /><TextBlock Text="CD:" Margin="10,2,0,2" /><TextBlock Text="{Binding Name}" Margin="2" /></StackPanel></DataTemplate></ComboBox.ItemTemplate></ComboBox><!--The UI for the details view--><StackPanel x:Name="RecordingDetails"><TextBlock Text="{Binding Artist}" FontSize="30" FontWeight="Bold" /><TextBlock Text="{Binding Name}" FontSize="30" FontStyle="Italic" /><TextBlock Text="{Binding ReleaseDate,Converter={StaticResource StringConverter},ConverterParameter=Released: \{0:d\}}" FontSize="30"  /></StackPanel></StackPanel></Grid></UserControl>

C#
VB

public class StringFormatter : IValueConverter
{// This converts the value object to the string to display.// This will work with most simple types.public object Convert(object value, Type targetType,object parameter, System.Globalization.CultureInfo culture){// Retrieve the format string and use it to format the value.string formatString = parameter as string;if (!string.IsNullOrEmpty(formatString)){return string.Format(culture, formatString, value);}// If the format string is null or empty, simply// call ToString() on the value.return value.ToString();}// No need to implement converting back on a one-way bindingpublic object ConvertBack(object value, Type targetType,object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}
}

上述代码会产生类似下图的输出。

转换器是从 IValueConverter 接口派生出的一个类。IValueConverter 有两种方法:Convert 和ConvertBack。对于从数据源到绑定目标的单向绑定,仅仅需要实现 Convert 方法。此示例中的转换器是相当通用的。可以将所需的字符串格式作为参数传递,且转换器会使用 String.Format 方法执行转换。如果未传递任何格式字符串,则转换器会返回在对象上调用 ToString 的结果。

在你实现转换器之后,你要立即创建转换器类的一个实例,并通知绑定使用此实例。在此示例中,这是在 XAML 中执行的。转换器的实例是作为静态资源创建的,并会向其分配一个键。在绑定上设置转换器属性时,会使用该键。

有关如何转换数据以便在控件中显示的详细信息,请参阅IValueConverter

WP8.1学习系列(第二十三章)——到控件的数据绑定相关推荐

  1. WP8.1学习系列(第五章)——中心控件Hub或透视控件Pivot交互UX

    具有主页菜单(中心或透视控件)的中心应用中心 你可能要设计包含许多功能的应用.当你看着这些功能时,可能会决定将它们整理到独立的区域中.这些区域最终会成为用户要访问的应用的独立部分.你需要设计一个简便的 ...

  2. WP8.1学习系列(第二十五章)——控件样式

      XAML 框架提供许多自定义应用外观的方法.通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visua ...

  3. WP8.1学习系列(第二十章)——添加控件和处理事件

    先决条件 添加控件 设置控件的名称 设置控件属性 创建事件处理程序 新控件 总结 相关主题 通过使用如按钮.文本框和组合框等控件,你可以创建应用的 UI. 下面将显示如何将控件添加到应用.处理控件时, ...

  4. WP8.1学习系列(第二十二章)——在页面之间导航

    在本文中 先决条件 创建导航应用 Frame 和 Page 类 页面模板中的导航支持 在页面之间传递信息 缓存页面 摘要 后续步骤 相关主题 重要的 API Page Frame Navigation ...

  5. WP8.1学习系列(第二章)——Toast通知

    Toast 通知概述(Windows 运行时应用) 你的应用要想通过 Toast 通知通信,必须在应用的清单文件中声明它支持 Toast.Toast 通知可包含文本,并且 Windows 上的 Toa ...

  6. asp.net ajax学习系列功能强大的UpdatePanel控件

    先给一个简单的例子,后面给一个比较复杂的例子. 改进后的UpdatePanel使页面部分更新(Partial-Page Updates)实现起来非常容易. 要想在已有web页面或新建页面中加入部分更新 ...

  7. 深入学习SAP UI5框架代码系列之四:SAP UI5控件的元数据实现

    这是Jerry 2021年的第5篇文章,也是汪子熙公众号总共第276篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) UI5 module懒加载机制 (2) ...

  8. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  9. 【正点原子Linux连载】第二十三章 DDR3实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

最新文章

  1. 留不住客户?该从你的系统上找找原因了
  2. winform如何保持TreeView节点展开和折叠的状态
  3. Linux的kickstart安装详解
  4. openfire安装配置完全教程
  5. 计算矩阵连乘积(动态规划)
  6. 【1024】阿里开源项目汇总
  7. .net 下语音合成
  8. winCE下Unicode编码
  9. tkinter中text属性_python tkinter基本属性详解
  10. hibernate get方法有执行sql但是后台拿不到_「6」进大厂必须掌握的面试题-Hibernate...
  11. 【clickhouse】yandex 官方 BalancedClickhouseDataSource 源码分析
  12. 都说“先卖人,后卖货”,或者说要想卖货,先卖人
  13. Spark算子--Scala版本 educoder
  14. centos7 端口3306无法连接问题
  15. 2020 年最牛逼的 10 门编程语言
  16. android定位!每个程序员都必须掌握的8种数据结构!完整版开放下载
  17. QT网络编程TCP/UDP开发流程 制作网络调试助手
  18. 基于MATLAB的疲劳检测
  19. MP3音频文件转换成caf格式
  20. CSDN博客专家认证通过暨我的CSDN成长之路!

热门文章

  1. 开课吧课堂:深入了解学习C++的意义与就业方向
  2. C++算法工程师需要具备开发能力
  3. 20道必须掌握的C++面试题
  4. Java基础篇:去探索String类
  5. Java基础篇:循环语句之do-while循环
  6. 阿里云成立技术脱贫联盟,要用技术助力脱贫
  7. IPv6协议漏洞将威胁核心路由器安全
  8. 为什么别人一周搞定Linux,而你却做不到
  9. 扩展正则表达式egrep11
  10. 利用linux mutt 发送邮件(在Shell脚本中使用比较方便)