我们之前一直讲的是控件的数据绑定,那么我们可不可以绑定一个类,让某个控件显示某个类的属性呢?答案是肯定的,因为我们的任何一个控件都是一个类,所以类的数据绑定跟控件的数据绑定是一样的。
OK,下面我先声明一个person类,它有两个属性,name和Age。
类代码如下:
using System;
using System.Net;
using System.windows;
using System.windows.Controls;
using System.windows.documents;
using System.windows.Ink;
using System.windows.input;
using System.windows.Media;
using System.windows.Media.Animation;
using System.windows.Shapes;
namespace dataBind
{
public class person:DependencyObject
{
private string name;
public string name
{
get { return name; }
set { name = value; }
}
private int age;
public int Age
{
get { return name; }
set { name = value; }
}
}
}
下面我托两个textBox,分别用来绑定person类的姓名跟年龄。
OK,为了能够让textBox绑定到person类的数据,首先我们得实例化这个类。
person p = new person() { name = "安亭",Age = 23 };
第二步,我们为textBox设置数据源:
private voID button1_Click(object sender,RoutedEventArgs e)
{
textBox1.DataContext = p;
textBox2.DataContext = p;
}
下面第三步,修改前台XAML文件,设置textBox绑定到person的哪个属性。
前台代码如下:
<navigation:Page x:Class="dataBind.bindClass"
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"
mc:Ignorable="d"
xmlns:navigation="clr-namespace:System.windows.Controls;assembly=System.windows.Controls.Navigation"
d:DesignWIDth="400" d:DesignHeight="200"
title="bindClass Page">
<GrID x:name="LayoutRoot">
<TextBlock Height="23" HorizontalAlignment="left" margin="61,24,0" name="textBlock1" Text="姓名:" VerticalAlignment="top" />
<TextBox Height="23" HorizontalAlignment="left" margin="100,0" Text="{Binding name,Mode=TwoWay}" name="textBox1" VerticalAlignment="top" WIDth="120" />
<TextBox Height="23" HorizontalAlignment="left" margin="98,79,0" Text="{Binding Age,Mode=TwoWay}" name="textBox2" VerticalAlignment="top" WIDth="120" />
<TextBlock Height="23" HorizontalAlignment="left" margin="58,81,0" name="textBlock2" Text="年龄:" VerticalAlignment="top" />
<button Content="显示" Height="23" HorizontalAlignment="left" margin="63,144,0" name="button1" VerticalAlignment="top" WIDth="75" Click="button1_Click_1" />
<button Content="设置" Height="23" HorizontalAlignment="left" margin="152,0" name="button2" VerticalAlignment="top" WIDth="75" />
</GrID>
</navigation:Page>
下面我修改textBox中的文本值,那么可以看到,它是双向绑定的:
这时候我设置person的姓名跟年龄,然后我再点显示,发现,并没有绑定过来。
p.name = "张三丰";
p.Age = 108;
MessageBox.Show("姓名:" + p.name + "\n年龄:" + p.Age);
它还是显示的原来的值,那这是为什么呢?大家还记得先前DependencyObjec么?
Silverlight中的数据绑定对被绑定对象有特殊要求,如果只是普通的get、set属性的对象用在数据绑定上有很多问题(无法双向绑定),一般要求继承自DependencyObject。
既然如此,我们就需要做下面几步:
//第一步,类必须继承自DependencyObject
//第二步,注册一个由Readonly修饰的DependencyProperty类型的静态字段,字段的名称一般要求为属性名+Property
public static Readonly DependencyProperty nameProperty =
DependencyProperty.Register("name",typeof(string),typeof(Person),null);//第一个参数:属性名,
第二个参数 属性的类型 第三个参数:属性所在类的类型 第四个: null
//第三步,定义用户使用属性。
下面我们看一个比较完整的person类定义:
using System;
using System.Net;
using System.windows;
using System.windows.Controls;
using System.windows.documents;
using System.windows.Ink;
using System.windows.input;
using System.windows.Media;
using System.windows.Media.Animation;
using System.windows.Shapes;
namespace dataBind
{
public class person:DependencyObject
{
private string name;
//public string name
//{
// get { return name; }
// set { name = value; }
//}
public string name
{
get { return (string)GetValue(nameProperty); }
set { SetValue(nameProperty,value); }
}
// Using a DependencyProperty as the backing store for name. This enables animation,styling,binding,etc...
public static Readonly DependencyProperty nameProperty =
DependencyProperty.Register("name",typeof(person),null );
private int age;
//public int Age
//{
// get { return name; }
// set { name = value; }
//}
public int Age
{
get { return (int)GetValue(AgeProperty); }
set { SetValue(AgeProperty,value); }
}
// Using a DependencyProperty as the backing store for Age. This enables animation,etc...
public static Readonly DependencyProperty AgeProperty =
DependencyProperty.Register("Age",typeof(int),null );
}
}
我们的后台代码是:
using System;
using System.Collections.Generic;
using System.linq;
using System.Net;
using System.windows;
using System.windows.Controls;
using System.windows.documents;
using System.windows.input;
using System.windows.Media;
using System.windows.Media.Animation;
using System.windows.Shapes;
using System.windows.Navigation;
namespace dataBind
{
public partial class bindClass : Page
{
public bindClass()
{
InitializeComponent();
}
person p = new person() { name = "安亭",Age = 23 };
// 当用户导航到此页面时执行。
protected overrIDe voID OnNavigatedTo(NavigationEventArgs e)
{
}
private voID button1_Click_1(object sender,RoutedEventArgs e)
{
textBox1.DataContext = p;
textBox2.DataContext = p;
MessageBox.Show("姓名:" + p.name + "\n年龄:" + p.Age);
}
private voID button2_Click(object sender,RoutedEventArgs e)
{
p.name = "张三丰";
p.Age = 108;
MessageBox.Show("姓名:" + p.name + "\n年龄:" + p.Age);
}
} }
总结以上是内存溢出为你收集整理的silverlight中类的绑定讲解全部内容,希望文章能够帮你解决silverlight中类的绑定讲解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)