快速构建Windows 8风格应用25-数据绑定

简介:
本篇博文主要介绍如何将 UI 元素与数据进行绑定、数据绑定的方向、数据更改通知、数据转换、数据绑定支持的绑定方案。

数据绑定是一种简单方式来显示数据, UI 元素与数据对象之间的连接或绑定是允许数据在两者之间流动的。另外建立了绑定且数据发生变化时,相应的 UI 元素会自动显示变化。

 

如何将UI元素与数据进行绑定

从上面图可以知道,每个绑定必须指定一个源和一个目标。

其中源对象可以是任何 CLR 对象,包括目标元素自身和其他 UI 元素。目标可以是 FrameworkElement 的任何 DependencyProperty (依赖属性)。

数据绑定引擎从 Binding 对象获取以下内容:

1 )源对象和目标对象;

2 )数据流的方向;

3 )值转换器;

例如:使用 C# 代码和 XAML TextBox Foreground 属性进行绑定。

XAML 代码:

<TextBox x:Name="MyTextBox" Text="Text" Foreground="{Binding Brush1, Mode=OneWay}"/>

C# 代码:

MyColors textcolor = new MyColors();

textcolor.Brush1 = new SolidColorBrush(Colors.Red);

MyTextBox.DataContext = textcolor;

绑定是使用 {Binding…} 语法在 XAML 中创建的。源是通过设置 TextBox DataContent 属性在代码中设置的。

另外数据是会被继承的。若我们在某个父元素上设置数据上下文,那么其子元素将使用同一数据。我们可以通过设置 Binding.Path 属性绑定到源对象的某个属性。

 

数据绑定的方向

每一个绑定都包含一个 Mode 属性,用于确定数据流动的方式和时间。

三种类型的绑定:

1 OneTime :绑定会在创建时使用源数据更新目标。

2 OneWay :绑定会在创建时以及数据发生更改时使用源数据更新目标(默认模式)。

3 TwoWay :绑定会在目标和源中的任一个发生更改时同时更新目标和源。

 

数据更改通知

当源数据对象进行了更改,如何将新的源数据对象传递给目标对象呢?解决办法是源数据对象继承 INotifyPropertyChanged   接口。因为 INotifyPropertyChanged  接口提供了 PropertyChanged  事件,该事件会告诉数据绑定引擎,源对象已经改变,方便更改目标值。

例如:

// Create a class that implements INotifyPropertyChanged.

public class MyColors : INotifyPropertyChanged

{

    private SolidColorBrush _Brush1;

 

    // Declare the PropertyChanged event.

    public event PropertyChangedEventHandler PropertyChanged;

 

    // Create the property that will be the source of the binding.

    public SolidColorBrush Brush1

    {

        get { return _Brush1; }

        set

        {

            _Brush1 = value;

            // Call NotifyPropertyChanged when the source property

            // is updated.

            NotifyPropertyChanged("Brush1");

        }

    }

 

    // NotifyPropertyChanged will raise the PropertyChanged event,

    // passing the source property that is being updated.

    public void NotifyPropertyChanged(string propertyName)

    {

        if (PropertyChanged != null)

        {

            PropertyChanged(this,

                new PropertyChangedEventArgs(propertyName));

        }

    }

}

示例代码中 MyColors 类继承了 INotifyPropertyChanged  接口,当 Brush1 属性更改时将触发 PropertyChanged 事件通知目标对象以及更改。

 

数据转换

当我们存储的数据在 UI 界面显示的时候,对用户来讲不友好时,可以将数据进行相应的转换进行显示。这时我们就需要一个数据的转换器了。

我们可以在任意的绑定上设置转换器,并且自定义转换器类必须继承实现 IValueConverter   接口。

例如:

// Custom class implements the IValueConverter interface.

public class DateToStringConverter : IValueConverter

{

 

    #region IValueConverter Members

 

    // Define the Convert method to change a DateTime object to

    // a month string.

    public object Convert(object value, Type targetType,

        object parameter, string language)

    {

        // value is the data from the source object.

        DateTime thisdate = (DateTime)value;

        int monthnum = thisdate.Month;

        string month;

        switch (monthnum)

        {

            case 1:

                month = "January";

                break;

            case 2:

                month = "February";

                break;

            default:

                month = "Month not found";

                break;

        }

        // Return the value to pass to the target.

        return month;

 

    }

 

    // ConvertBack is not implemented for a OneWay binding.

    public object ConvertBack(object value, Type targetType,

        object parameter, string language)

    {

        throw new NotImplementedException();

    }

 

    #endregion

}

当从源对象传递数据时,绑定引擎会调用 Convert   并将返回的数据传递回目标。

当从目标传递数据时,绑定引擎会调用 ConvertBack   并将返回的数据传递回源。

XAML 代码中设置 Converter

<UserControl.Resources>

  <local:DateToStringConverter x:Key="Converter1"/>

</UserControl.Resources>

 

...

 

<TextBlock Grid.Column="0"

  Text="{Binding Month, Converter={StaticResource Converter1}}"/>

转换器中还有两个可选参数: ConverterLanguage (该参数允许指定在转换中使用的语言)和   ConverterParameter (该参数允许为转换逻辑传递一个参数)。

注意:若在数据转换中存在错误,最好不要抛出异常,而是返回 DependencyProperty.UnsetValue ,它将停止数据传输。

 

支持的绑定方案

方案

C#

绑定到对象

可以为任何对象

从绑定对象中获取属性更改更新

数据对象必须实现 INotifyPropertyChanged 接口

绑定到集合

使用 List(Of T)

从绑定集合中获取集合更改更新

实现支持绑定的集合

扩展   List(Of T)   或实现   IList IList (属于   Object )、 IEnumerable    IEnumerable (属于  Object )。绑定到通用  IList(Of T)   IEnumerable(Of T)  的操作不受支持

实现支持集合更改更新的集合

扩展 ObservableCollection(Of T)   或实现(非通用) IList     INotifyCollectionChanged

实现支持增量加载的集合

扩展   ObservableCollection(Of T)   或实现(非通用) IList     INotifyCollectionChanged 。此外,还实现 ISupportIncrementalLoading

注:该表格根据 MSDN 提供的文档进行相应的整理。

更多关于数据绑定的文章可参考:





 本文转自 王祖康 51CTO博客,原文链接:http://blog.51cto.com/wzk89/1057368,如需转载请自行联系原作者

相关文章
|
22天前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
23天前
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
55 3
|
25天前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
19天前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
31 0
|
19天前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
22 0
|
19天前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
41 0
|
25天前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
开发者 Windows 数据格式
快速构建Windows 8风格应用14-ShareContract概述及原理
原文:快速构建Windows 8风格应用14-ShareContract概述及原理 本篇博文主要介绍Share Contract概述、Share Contract实现原理、实现Share Contract意义。
737 0