wp7数据绑定

    Silverlight中的数据绑定对被绑定对象有特殊要求,如果只是普通的get、set属性的对象用在数据绑定上有很多问题(无法双向绑定),一般要求类实现INotifyPropertyChanged接口或者继承自DependencyObject,现在推荐用DependencyObject 的方法

 

 

第一种绑定方式:实现INotifyPropertyChanged接口

 1 public class Person:INotifyPropertyChanged

 2     {

 3        public event PropertyChangedEventHandler PropertyChanged;

 4 

 5        private string name;

 6       public string Name

 7       {

 8          get

 9            {

10                return name;

11            }

12          set

13           {

14                name = value;

15               if (PropertyChanged != null)

16                {

17                     PropertyChanged(this, new PropertyChangedEventArgs("Name"));

18                }

19            }

20        }

21 }

第二种绑定方式:实现DependencyObject接口(推荐)--快捷方法:输入propdp然后tab

 1  public class Person : DependencyObject

 2     {

 3         //静态的、DependencyProperty类型的、属性名+Property= DependencyProperty.Register("属性名",typeof(属性类型),

 4            // typeof(所属类),null);

 5 

 6         public static DependencyProperty NameProperty = DependencyProperty.Register("Name",typeof(string),

 7             typeof(Person),null);

 8 

 9         public string Name 

10         {

11             get

12             {

13                 return (string)GetValue(NameProperty);

14             }

15             set

16             {

17                 SetValue(NameProperty, value);

18             }

19         }

三种绑定模式:

OneTime:一次绑定,绑定创建时使用源数据更新控件。(可以是普通的set、get属性)。

OneWay (默认值):单向绑定,在绑定创建时使用源数据更新控件,当源数据发生变化的时候也更新控件。(必须实现INotifyPropertyChanged接口或者继承自DependencyObject)。相当于Eval

TwoWay:双向绑定,数据源的变化会更新控件,控件的变化也会更新到数据源。(必须实现INotifyPropertyChanged接口或者继承自DependencyObject)。相当于Bind

 

 

加法计算器:

定义一个类:

 1  public class jiafa:DependencyObject

 2     {

 3         public int sum1

 4         {

 5             get { return (int)GetValue(sum1Property); }

 6             set { SetValue(sum1Property, value); }

 7         }

 8 

 9         // Using a DependencyProperty as the backing store for sum1.  This enables animation, styling, binding, etc...

10         public static readonly DependencyProperty sum1Property =

11             DependencyProperty.Register("sum1", typeof(int), typeof(jiafa), null);

12         public int sum2

13         {

14             get { return (int)GetValue(sum2Property); }

15             set { SetValue(sum2Property, value); }

16         }

17         public static readonly DependencyProperty sum2Property = DependencyProperty.Register("sum2",typeof(int),typeof(jiafa),null);

18  }

19 

20   public int result

21         {

22             get { return (int)GetValue(resultProperty); }

23             set { SetValue(resultProperty, value); }

24         }

25 

26         // Using a DependencyProperty as the backing store for result.  This enables animation, styling, binding, etc...

27         public static readonly DependencyProperty resultProperty =

28             DependencyProperty.Register("result", typeof(int), typeof(jiafa),null);

导入命名空间

1  xmlns:ctrl="clr-namespace:复习0819"
 1   <phone:PhoneApplicationPage.Resources>

 2         <ctrl:jiafa x:Key="jiafa"></ctrl:jiafa>

 3     </phone:PhoneApplicationPage.Resources>

 4     <!--LayoutRoot 是包含所有页面内容的根网格-->

 5   <Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{StaticResource jiafa}">

 6         <TextBox Height="72" HorizontalAlignment="Left" Margin="12,127,0,0" Name="textBox1" Text="{Binding sum1,Mode=TwoWay}" VerticalAlignment="Top" Width="460" />

 7         <TextBox Height="72" HorizontalAlignment="Left" Margin="20,271,0,0" Name="textBox2" Text="{Binding sum2}" VerticalAlignment="Top" Width="460" />

 8         <Button Content="相加" Height="72" HorizontalAlignment="Left" Margin="98,414,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click_1" />

 9         <TextBlock Height="44" HorizontalAlignment="Left" Margin="54,517,0,0" Name="textBlock1" Text="{Binding result}" VerticalAlignment="Top" Width="280" />

10     </Grid>

后台代码

1  private void button1_Click_1(object sender, RoutedEventArgs e)

2         {

3            jiafa jf=(jiafa)this.Resources["jiafa"];

4            jf.result = jf.sum1 + jf.sum2;

5            

6         }

数据绑定的Converter:

  之前计算器的例子发现Model的属性是int类型,但是文本框的Text属性是string类型,也能双向绑定,这是因为有值转换器。

  但是当我们从数据中取出来的值是0和1,并分别要表示男和女;这个时候系统就不能帮我们进行复杂的类型转换,不可能把1变成男展示给用户;

所以我们要自己写一个转换器

 

定义一个枚举:

1 Public enum Gender{ Female,Male,Unkown};
 1  public class GenderStringConverter:IValueConverter

 2     {

 3         //正向转换:Model到UI的转换

 4         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

 5         {

 6             //value为Model中属性的值

 7             //返回值为转换后UI中的值

 8             Gender gender = (Gender)value;

 9             switch (gender)

10             {

11                 case Gender.Female:

12                     return "";

13                 case Gender.Male:

14                     return "";

15                 case Gender.Unkown:

16                     return "非常男女";

17                 default :

18                     throw new Exception("Gender出现预期之外的值");

19             }

20         }

21 

22         //当UI变化时,把UI中的值转换为Model中的值

23         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

24         {

25             string s = (string)value;

26             switch (s)

27             {

28                 case "":

29                     return Gender.Male;

30                 case "":

31                     return Gender.Female;

32                 case "非常男女":

33                     return Gender.Unkown;

34                 default :

35                     //throw new Exception();

36                     return Gender.Unkown;

37             }

38         }

39     }

转换器的用法:

先在需要用到转换器的页面进行引入;

第一步

1 xmlns:my="clr-namespace:PhoneApp1"

第二步

1 <phone:PhoneApplicationPage.Resources>

2         <my:GenderStringConverter x:Key="genderStrConverter"></my:GenderStringConverter>

3 

4     </phone:PhoneApplicationPage.Resources>

第三步

1 <TextBox Text="{Binding Gender,Mode=TwoWay,Converter={StaticResource genderStrConverter}}"></TextBox>

 

 

你可能感兴趣的:(数据绑定)