WPF 10天修炼 第十天- WPF数据绑定

WPF数据绑定

数据绑定到元素属性是将源对象指定为一个WPF元素,并且源属性是一个依赖属性,依赖属性内置了变更通知。当改变源对象依赖属性值之后,绑定目标可以立即得到更新,开发人员不需要手动编写响应事件。

在绑定来源和绑定目标之间,可以使用Mode属性指定绑定的方法。Mode属性是System.Windows.Data.BindMode枚举类型的属性:

OneWay:源数据变更目标数据变更,反之不行

OneTime:仅在启动时更新

OneWayToSource:目标数据更新源数据更新,反之不行

TwoWay:源数据变更目标数据变更,反之可以

如果使用TwoWay绑定模式,当目标文本框对象发生变更时,变化不会立即被传到数据源,除非用户使当前控件失去焦点之后,否则源数据不会发生变更。可以通过设置Binding.UpdateSourceTrigger属性设置更新方式:

Default:绑定目标属性的默认UpdateSourceTrigger值。多数依赖项属性默认值为PropertyChanged,而Text属性则为LostFocus。这就是为什么文本框对象需要失去焦点才可以变更原数据。

ProertyChannged:当绑定目标属性更改时,立即更新绑定源。

LostFocus:当绑定目标元素失去焦点时,更新绑定源。

Explicit:仅在调用UpdateSource()方法时更新绑定数据源。

绑定元素属性

<Window x:Class="WPFDemo.BindElementsDemo"
        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="clr-namespace:WPFDemo"
        mc:Ignorable="d"
        Title="BindElementsDemo" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Width" Value="200" />
            <Setter Property="Height" Value="20" />
            <Setter Property="Margin" Value="5" />
        </Style>
    </Window.Resources>
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition /> <RowDefinition />
            <RowDefinition /> <RowDefinition />
            <RowDefinition /> <RowDefinition />
            <RowDefinition /> <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Label Grid.Column="0" Grid.Row="0" Margin="5" Content="源数据" />
        <Label Grid.Column="1" Grid.Row="0" Margin="5" Content="目标数据" />
        <!--使用OneWay绑定模式 源数据变更目标数据变更,反之不行-->
        <Label Grid.Row="1" Grid.Column="0" Content="OneWay Mode"></Label>
        <TextBox Grid.Row="1" Grid.Column="0" Name="txt1"></TextBox>
        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding ElementName=txt1,Path=Text,Mode=OneWay}"></TextBox>
         <!--使用OneTime绑定模式 仅在启动时更新-->
        <Label Grid.Row="2" Grid.Column="0" Content="OneTime Mode"></Label>
        <TextBox Grid.Row="2" Grid.Column="0" Name="txt3"></TextBox>
        <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding ElementName=txt3,Path=Text,Mode=OneTime}"></TextBox>

        <!--使用OneWayToSource绑定模式 目标数据更新源数据更新,反之不行-->
        <Label Grid.Row="3" Grid.Column="0" Content="OneWayToSource Mode"></Label>
        <TextBox Grid.Row="3" Grid.Column="0" Name="txt4"></TextBox>
        <TextBox Grid.Row="3" Grid.Column="1" Text="{Binding ElementName=txt4,Path=Text,Mode=OneWayToSource}"></TextBox>

        <!--使用TwoWay绑定模式 源数据变更目标数据变更,反之可以-->
        <Label Grid.Row="4" Grid.Column="0" Content="TwoWay Modem默认"></Label>
        <TextBox Grid.Row="4" Grid.Column="0" Name="txt2"></TextBox>
        <TextBox Grid.Row="4" Grid.Column="1" Text="{Binding ElementName=txt2,Path=Text,Mode=TwoWay}"></TextBox>

        <!--使用TwoWay绑定模式调用UpdateSource时更新 源数据变更目标数据变更,反之可以-->
        <Label Grid.Row="5" Grid.Column="0" Content="TwoWay Modem 目标数据更改Explicit调用UpdateSource时更新"></Label>
        <TextBox Grid.Row="5" Grid.Column="0" Name="txt5"></TextBox>
        <TextBox Grid.Row="5" Grid.Column="1" Text="{Binding ElementName=txt5,Path=Text,Mode=TwoWay,UpdateSourceTrigger=Explicit}"></TextBox>

        <!--使用TwoWay绑定模式失去焦点更新 源数据变更目标数据变更,反之可以-->
        <Label Grid.Row="6" Grid.Column="0" Content="TwoWay Modem 目标数据更改失去焦点时更新"></Label>
        <TextBox Grid.Row="6" Grid.Column="0" Name="txt6"></TextBox>
        <TextBox Grid.Row="6" Grid.Column="1" Text="{Binding ElementName=txt6,Path=Text,Mode=TwoWay,UpdateSourceTrigger=LostFocus}"></TextBox>

       <!--使用TwoWay绑定模式立即更新 源数据变更目标数据变更,反之可以-->
        <Label Grid.Row="7" Grid.Column="0" Content="TwoWay Modem 目标数据更改立即更新"></Label>
        <TextBox Grid.Row="7" Grid.Column="0" Name="txt7"></TextBox>
        <TextBox Grid.Row="7" Grid.Column="1" Text="{Binding ElementName=txt7,Path=Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>

    </Grid>
</Window>

绑定元素多个属性

<Window x:Class="WPFDemo.BindElemntsMulPropertyDemo"
        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="clr-namespace:WPFDemo"
        mc:Ignorable="d"
        Title="BindElemntsMulPropertyDemo" Height="300" Width="500">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <!--Slider设置字体大小-->
        <Label  Grid.Row="0" Grid.Column="0" Content="字体大小" />
        <Slider Grid.Row="0" Grid.Column="1"  Name="sliderFontSize" Margin="5" Minimum="8" Maximum="20" Value="10"/>
        <!--设置文本内容-->
        <Label   Grid.Column="0" Grid.Row="1" Content="文本内容" />
        <TextBox Grid.Column="1" Margin="5" Grid.Row="1" Name="txtContent"  Text="绑定多个属性值"/>
        <!--设置字体颜色-->
        <Label   Grid.Column="0" Grid.Row="2" Content="字体颜色" />
        <ListBox Grid.Column="1" Grid.Row="2" Margin="5" Name="FontColor">
            <ListBoxItem Tag="Blue">Blue</ListBoxItem>
            <ListBoxItem Tag="Red">Red</ListBoxItem>
            <ListBoxItem Tag="Yellow">Yellow</ListBoxItem>
        </ListBox>

        <TextBlock   Grid.Column="0" Grid.ColumnSpan="2" Margin="5" Grid.Row="3"  FontSize="{Binding ElementName=sliderFontSize,Path=Value}"
                   Text="{Binding ElementName=txtContent,Path=Text}"
                   Foreground="{Binding ElementName=FontColor,Path=SelectedItem.Tag}">
        </TextBlock>
    </Grid>
</Window>

总结:陆陆续续将十天的“修炼”成果发布出来;说是十天修炼,实际从发布第一篇笔记开始到现在已经28天了4周整。时光匆匆,这些内容一共看了两遍,第一次只是看了一遍没有什么印象,第二次将所有的代码都敲了一遍,收获颇丰。笔记不仅可以方便以后进行查漏补缺,经过时间的沉淀还可以总结出自己的一套学习方法。再接再厉。

Stay Hungry Stay Foolish !

求知若饥 虚心若愚!

时间: 2024-10-31 03:14:39

WPF 10天修炼 第十天- WPF数据绑定的相关文章

WPF 10天修炼 - 内容控件

WPF内容控件 在WPF中,所有呈现在用户界面上的对象都称为用户界面元素.但是只有派生自System.Windows.Controls.Control类的对象才称为控件.内容控件通常是指具有Content属性的控件,Content属性并非定义在每个控件中,而是定义在基类System.Windows.Controls命名空间的ContentControl类中.注意:Content属性只接收单个内容元素. WPF内容控件分类 1.  直接继承ContentControl的控件 2.  继承Heade

WPF 10天修炼 - WPF布局容器

WPF布局 WPF的窗口也就是Window类,是一个内容控件,该控件派生自ContentControl.内容控件有一个Content属性,该属性有一个限制,只能放置一个用户界面元素,或一个字符串.为了在窗口上放置多个界面控件,通常在窗口上放置一个容器控件. WFP布局原则 1.  元素不应该指定 确定的尺寸大小,同很惨更应该使其大小自动适应内容.比如按钮根据所添加的文本来扩展其大小.可以通过设置maximun和minimun尺寸来限制控件可接受的尺寸大小. 2.  元素不应该使用屏幕坐标来指定其

WPF 10天修炼 第八天 - 形状、画刷和变换

图形 在WPF中使用绘图最简单的就是使用Shape类.Shape类继承自FrameworkElement,是一个专门用来绘图的类.Shape类中年派生的类有直线.矩形.多边形和圆形等. System.Windows.Shapes.Shape类是一个抽象类,从该类又派生出多个不同的子类,如下图: Shape类的通用属性 属性名称 描述 Fill 绘制填充的画刷 Stroke 绘制边框的画刷 StrokeThickness 与设备无关的边框宽度 StrokeStartLineCap和StrokeEn

WPF 10天修炼 - Application全局应用程序类

Application对象 当一个WPF应用程序启动时,首先会实例化一个全局唯一的Application对象,类似于WinForm下的Application类,用于控制整个应用程序,该类将用于追踪应用程序打开的窗口.在应用程序打开或关闭的时候能够触发相应的事件. 创建Application对象 手动创建Application应用程序对象过程: 1.  使用VS创建WPF应用程序,命名为WPFDemo.然后手动清除App.xaml文件. 2.  添加Startup.cs类,并添加程序代码.如下:

WPF 10天修炼 第九天 - 几何图形

几何图形 使用LineGeometry.RectangleGeometry.EllipseGeometry对象分别绘制直线.矩形.椭圆. 使用GeometryGroup可以绘制组合图形. <Window x:Class="WPFDemo.GeometryDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.micr

【WPF学习】第四十四章 图画

原文:[WPF学习]第四十四章 图画 通过上一章的学习,Geometry抽象类表示形状或路径.Drawing抽象类扮演了互补的角色,它表示2D图画(Drawing)--换句话说,它包含了显示矢量图像或位图需要的所有信息. 尽管有几类画图类,但只有GeometryDrawing类能使用已经学习过的几何图形.它增加了决定如何绘制图形的画笔和填充细节.可将GeometryDrawing对象视为矢量插图中的形状.例如,可将标准的窗口元文件格式(.wmf)转换成准备插入用户界面的GeometryDrawi

【WPF学习】第三十二章 执行命令

原文:[WPF学习]第三十二章 执行命令 前面章节已经对命令进行了深入分析,分析了基类和接口以及WPF提供的命令库.但尚未例举任何使用这些命令的例子. 如前所述,RoutedUICommand类没有任何硬编码的功能,而是只表达命令,为触发命令,需要有命令源(也可使用代码).为响应命令,需要有命令绑定,命令绑定将执行转发给普遍的事件处理程序. 一.命令源 命令库中的命令始终可用.触发他们的最简单的方法是将它们关联到实现了ICommandSource接口的控件,其中包括继承自ButtonBase类的

【WPF学习】第三十六章 样式基础

原文:[WPF学习]第三十六章 样式基础 前面三章介绍了WPF资源系统,使用资源可在一个地方定义对象而在整个标记中重用他们.尽管可使用资源存储各种对象,但使用资源最常见的原因之一是通过他们的保存样式. 样式是可应用于元素的属性值集合.WPF样式系统与HTML标记中的层叠样式表(Cascading Style Sheet,CSS)标准担当类似的角色.与CSS类似,通过WPF样式可定义通用的格式化特性集合,并且为了保证一致性,在整个应用程序中应用他们.与CSS一样,WPF样式也能够自动工作,指定具体

【WPF学习】第三十五章 资源字典

原文:[WPF学习]第三十五章 资源字典 如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/wi