开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

数据绑定(一)

简介:
+关注继续查看


在.net中,数据绑定对程序的快速开发提供了一个便利,像一些列表控件,combox,Listbox,datagridview等,都是通过这种简单的绑定,来实现批量数据的展示。WPF中的数据绑定又提升了一个等级,不但数据库与UI控件能绑定,UI控件与UI控件的绑定都可以实现,并且绑定到控件上的属性也得到了大的扩展(以前最常用的绑定属性是DataSource)。

image

绑定这个词就告诉我们,应该是把两个或更多的事或物结合在一起,是的,在WPF中的绑定,是把绑定目标和绑定源(通常是数据集合,对象,元素控件)结合在一起,这种结合是有选择的结合,所以在绑定目标和绑定源中,都要先择出绑定的属性。举个例子,我们有一个下拉列表,有一个文本框,我们希望选中的下拉项,显示到文本框中,这时,下拉列表就是一个绑定源,选中的项就是绑定源属性,文本框就是绑定目标,Text属性就是绑定目标属性。要注意的是,绑定源没有限制,可以是WPF的元素控件,也可以是一个集合,可以是对象,可以是XML数据等,但绑定目标中的绑定属性就有限制了,它必需是依赖项属性。

在绑定中,绑定源和绑定目标有一个桥梁,这个桥量是有方向的,这个方向是通过一个BindingMode枚举来区分的,这个枚举代码如下:

    public enum BindingMode

    {

       // 绑定源和绑定目标双方触发更新

        TwoWay = 0,

       // 绑定源触发绑定目标更新

        OneWay = 1,

        //绑定源触发绑定目标更新一次(只是在初始化的时侯)

        OneTime = 2,

        //绑定目标触发绑定源更新

        OneWayToSource = 3,

        //默认值,根据控件来确定是单向还是双向,一般情况下,可编辑控件是双向绑定,不可编辑控件是单向绑定(即OneWay方式)

        Default = 4,

    }

}

接下来,先看一个简单的元素控件和元素控件的绑定。

<Label Content="{Binding ElementName=textBox1,Path=Text}" Height="28" HorizontalAlignment="Left" Margin="146,10,0,0" Name="label1" ;57" />

Content是用绑定来实现的,当然Lable是绑定目标对象,Content就是绑定目标属性了,绑定源就是ElementName=textBox1,绑定源属性是Path=Text,由于Lable是不可编辑的,所以Lable.Content的变化只能依据TextBox.Text了。

上面是通过属性绑定,代码绑定如下:

            label1.DataContext = textBox1;

            label1.SetBinding(Label.ContentProperty, "Text");

接下来,绑定一个对象,对象生成的类如下:

public class Person

    {

int age;

public int Age

        {

get

            {

return age;

            }

set

            {

                age = value;

            }

        }

string name;

public string Name

        {

get

            {

return name;

            }

set

            {

                name = value;

            }

        }

    }

接下来,用TextBox来显示这个对象的Age属性,可以承载TextBox 的窗里的构造里实例化一个对象:

person = new Person();

person.Age = 25;

textBox1.DataContext = person;

让文本框的数据绑定到person这个对象上(也以把person对象绑定到textBox1的父对元素的DataContext上)。

然后把textBox1的Text绑定到对象的Age上,可以用标签属性,也可以用代码,分别如下:

<TextBox  Height="23" Text="{Binding Path=Age}" Margin="12,31,0,0" Name="textBox1"  ;120" >

textBox1.SetBinding(TextBox.TextProperty, "Age")

上面的绑定都比较简单,有时间要进行比较特别的绑定,那就是绑定源属性与绑定目标属性类型不一样,这样的话就需要作一个类型转换。在窗体上放置一个label2,它的背景色根据Age的变化而变化,小于等20岁为红色,大于20小于等于50为绿色,大于50为蓝色,这如何实现?

首先得构造类型转换类,在绑定中的转换,微软提供了一个接口IValueConverter,我们必需实现这个接口,才能实现绑定的类型转换。转换定意如下:

[ValueConversion(typeof(int), typeof(Brush))]

class ConvertClass : IValueConverter

    {

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

        {

if (targetType != typeof(Brush))

            {

return null;

            }

int age = int.Parse(value.ToString());

SolidColorBrush scb = Brushes.White; ;          

if (age <= 20)

            {

                scb = Brushes.Red;

            }

if (age &lt;= 50 && age > 20)

            {

                scb = Brushes.Green;

            }

if (age &gt; 50)

            {

                scb = Brushes.Blue ;

            }

return scb;

        }

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

        {

throw new Exception();

        }

    }

这个接口有两个方法,一个Convert和一个ConvertBack,即两个类型的转换“来”和转换“去”。

在XAML元素中设置,首先设置一个Windows资源(就类似于实例化一个ConvertClass对象一样)

<Window.Resources>

<m:ConvertClass x:Key="Conv"></m:ConvertClass>

</Window.Resources>

然后绑定label2:

<Label  Height="28" Background="{Binding Path=Age,Converter={StaticResource Conv}}"  Margin="66,60,0,0" Name="label2" ;106" />

代码实现如下:

Binding bd = new Binding();

  bd.Path = new PropertyPath("Age");

  bd.Converter = new ConvertClass();

  label2.SetBinding(Label.BackgroundProperty, bd);




















本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/414344 ,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ItemsControl的两种数据绑定方式
原文:ItemsControl的两种数据绑定方式      最近在学习ItemsControl这个控件的时候,查看了MSDN上面的一个例子,并且自己做了一些修改,这里主要使用了两种方式来进行相应的数据绑定,一种是使用DataContext,另外一种是直接将一个类绑定到前台,其实这两种方式原理差不多都...
877 0
winform treeView 数据绑定
转载:http://www.jetwu.cn/archives/737 winform treeView 数据绑定 private void Form1_Load(object sender, EventArgs e) { Types = new...
499 0
DataGrid和DataGridComboBoxColumn数据绑定
MainWindow.xaml文件 &lt;Window x:Class="WpfApp20140821.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/200
1261 0
关于数据绑定的一些小技巧
Eval内部必须是双引号,因为它是普通的c#方法。 Eval可以使用第二个参数格式化,因此例如你就可以写: --------- Barcode字段存储的是条形码号,如果条形号码为空,则显...
464 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载