zoukankan      html  css  js  c++  java
  • WPF中INotifyPropertyChanged用法与数据绑定

    在WPF中进行数据绑定的时候常常会用到INotifyPropertyChanged接口来进行实现,下面来看一个INotifyPropertyChanged的案例。

    下面定义一个Person类:

    [csharp] view plain copy
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5. using System.ComponentModel;  
    6.   
    7. namespace WpfApp  
    8. {  
    9.     public class Person:INotifyPropertyChanged  
    10.     {  
    11.         private String _name = "张三";  
    12.         private int _age = 24;  
    13.         private String _hobby = "篮球";  
    14.             
    15.         public String Name  
    16.         {  
    17.             set  
    18.             {  
    19.                 _name = value;  
    20.                 if (PropertyChanged != null)//有改变  
    21.                 {  
    22.                     PropertyChanged(thisnew PropertyChangedEventArgs("Name"));//对Name进行监听  
    23.                 }  
    24.             }  
    25.             get  
    26.             {  
    27.                 return _name;  
    28.             }  
    29.         }  
    30.   
    31.         public int Age  
    32.         {  
    33.             set  
    34.             {  
    35.                 _age = value;  
    36.                 if (PropertyChanged != null)  
    37.                 {  
    38.                     PropertyChanged(thisnew PropertyChangedEventArgs("Age"));//对Age进行监听  
    39.                 }  
    40.             }  
    41.             get  
    42.             {  
    43.                 return _age;  
    44.             }   
    45.         }  
    46.         public String Hobby//没有对Hobby进行监听  
    47.         {  
    48.             get { return _hobby; }  
    49.             set { _hobby = value; }  
    50.         }  
    51.         public event PropertyChangedEventHandler PropertyChanged;  
    52.     }  
    53. }  
    上面定义的这个Person类中,对Name和Age属性进行了监听,但是没有对Hobby进行监听。

    MainWindow.xmal界面文件定义的内容如下:

    [csharp] view plain copy
    1. <Window x:Class="WpfApp.MainWindow"  
    2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    4.         Title="MainWindow" Height="300" Width="350">  
    5.     <Grid Name="grid">   
    6.         <TextBox Height="20" Text="{Binding Path=Name}"  HorizontalAlignment="Left" Margin="63,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="139" />  
    7.         <TextBox Height="20"  Text="{Binding Path=Age}"  HorizontalAlignment="Left" Margin="63,48,0,0" Name="textBox2" VerticalAlignment="Top" Width="139" />  
    8.         <TextBox Height="20" Text="{Binding Path=Hobby}"  HorizontalAlignment="Left" Margin="63,82,0,0" Name="textBox3" VerticalAlignment="Top" Width="139" />  
    9.           
    10.         <Button Content="显示用户信息" Height="26" HorizontalAlignment="Left" Margin="60,118,0,0" Name="button1" VerticalAlignment="Top" Width="144" Click="button1_Click" />  
    11.         <Button Content="修改用户信息" Height="26" HorizontalAlignment="Left" Margin="60,158,0,0" Name="button2" VerticalAlignment="Top" Width="144" Click="button2_Click" />  
    12.   
    13.         <TextBlock Height="40" HorizontalAlignment="Left" Margin="13,201,0,0" Name="textBlock1"   Text="{Binding Path=Name}"  VerticalAlignment="Top" Width="88" />  
    14.         <TextBlock Height="40" HorizontalAlignment="Left" Margin="118,201,0,0" Name="textBlock2" Text="{Binding Path=Age}" VerticalAlignment="Top" Width="88" />  
    15.         <TextBlock Height="40" HorizontalAlignment="Left" Margin="222,201,0,0" Name="textBlock3" Text="{Binding Path=Hobby, Mode=TwoWay}" VerticalAlignment="Top" Width="88" />  
    16.     </Grid>  
    17. </Window>  

    后台代码是:

    [csharp] view plain copy
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5. using System.Windows;  
    6. using System.Windows.Controls;  
    7. using System.Windows.Data;  
    8. using System.Windows.Documents;  
    9. using System.Windows.Input;  
    10. using System.Windows.Media;  
    11. using System.Windows.Media.Imaging;  
    12. using System.Windows.Navigation;  
    13. using System.Windows.Shapes;  
    14.   
    15. namespace WpfApp  
    16. {  
    17.     /// <summary>  
    18.     /// MainWindow.xaml 的交互逻辑  
    19.     /// </summary>  
    20.     public partial class MainWindow : Window  
    21.     {  
    22.         public MainWindow()  
    23.         {  
    24.             InitializeComponent();  
    25.         }  
    26.   
    27.         private Person p1 = new Person();  
    28.         private void button1_Click(object sender, RoutedEventArgs e)  
    29.         {  
    30.             grid.DataContext = p1;//绑定数据  
    31.             p1.Name = "李四";   
    [csharp] view plain copy
    1.             p1.Hobby = "足球";  
    2.         }   
    3.         private void button2_Click(object sender, RoutedEventArgs e)  
    4.         {     
    5.             p1.Age = p1.Age + 1;  
    6.             p1.Hobby = "足球";  
    7.         }  
    8.     }  
    9. }  

    当点击显示用户数据的时候


    下面看看这些信息具体都来自于哪儿?


    由于在Person中没有对Hobby进行监听,所以p1.Hobby="足球"这个语句没有起到作用。 点击修改用户信息的时候也是不能修改绑定到界面上的对应Hobby的信息(即使是在界面处写了Mode=TwoWay,也是不能进行绑定的)。

    所以使用INotifyPropertyChanged的时候,需要对要进行绑定的属性进行显示的设置的,否则绑定的时候是不能进行双向绑定的,即绑定是无效的。

  • 相关阅读:
    hdu 4521 小明系列问题——小明序列(线段树 or DP)
    hdu 1115 Lifting the Stone
    hdu 5476 Explore Track of Point(2015上海网络赛)
    Codeforces 527C Glass Carving
    hdu 4414 Finding crosses
    LA 5135 Mining Your Own Business
    uva 11324 The Largest Clique
    hdu 4288 Coder
    PowerShell随笔3 ---别名
    PowerShell随笔2---初始命令
  • 原文地址:https://www.cnblogs.com/dxmfans/p/9434892.html
Copyright © 2011-2022 走看看