WPF学习(19)-数据绑定

      wpf有一个特性,叫做数据驱动,我个人的理解就是把业务逻辑抽出来,变成数据,数据变化来驱动咱们的应用程序。在之前的WINFORM时代,其实已经有了数据绑定,比如我们的datagridview,可以绑定一个dataset,source直接绑定就可以,原理上来说类似,但是WPF由于有了依赖属性,那么属性通知做的更好,意味着,我们的数据绑定对于前台的变化会更高效。

        下面这个例子就是把一个类的对象,绑定到前台页面展示。

    <Grid>
        <Label Content="Label" HorizontalAlignment="Left" Margin="92,70,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="173,74,0,0" TextWrapping="Wrap" Text="{Binding Path=Name}" VerticalAlignment="Top" Width="120"/>
        <Label Content="Label" HorizontalAlignment="Left" Margin="92,129,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="173,133,0,0" TextWrapping="Wrap" Text="{Binding Path=Age}" VerticalAlignment="Top" Width="120"/>
        <Label Content="Label" HorizontalAlignment="Left" Margin="92,188,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="173,192,0,0" TextWrapping="Wrap" Text="{Binding Path=Company}" VerticalAlignment="Top" Width="120"/>
    </Grid>
        public MainWindow()
        {
            InitializeComponent();
            Person p = new Person();
            p.Name = "洪波";
            p.Age = 31;
            p.Company = "奔骝科技";
            this.DataContext = p;
        }

     我们加个按钮,去更新这个类的姓名,发现前台并没有发生改变,这是为什么呢?因为我们的类的属性并不是依赖属性,当然还有另外一个办法,就是继承自INotifyPropertyChanged,当这个类的属性更新,现在前台再次更新就会改变啦。

    public class Person:INotifyPropertyChanged
    {
        
   
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Name"));
            }
        }
        private int age;
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private string company;
        public string Company
        {
            get { return company; }
            set { company = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Company"));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged!=null)
            {
                PropertyChanged(this,e);
            }
        }
    }

         当然可以绑定多个数据,而不是单值,比如下面这个图片,是我们公司的高精度定位系统的测试工具,datagrid就是在后台绑定了一个集合,然后根据socket自动更新这个集合,前台不断变化的例子,包括页面左边的treeview也是做的数据绑定,这样的好处就是,当我的设备掉线或者上线的时候,可以立马更新,而不是要用代码去处理了。

       datagrid的itemsource指定集合,具体的类如下,也是同样的继承自INotifyPropertyChanged,这样就自动通知了。

  ShowResult.ItemsSource = Tags;
   public class TagInfo : INotifyPropertyChanged
    {
        private string devID;//基站ID

        public string DevID
        {
            get { return devID; }
            set { devID = value;
            OnPropertyChanged(new PropertyChangedEventArgs("DevID"));
            }
        }
        private string tagID;//标签号 

        public string TagID
        {
            get { return tagID; }
            set { tagID = value;
            OnPropertyChanged(new PropertyChangedEventArgs("TagID"));
            }
        }
        private int devRssi;//基站信号强度

        public int DevRssi
        {
            get { return devRssi; }
            set { devRssi = value;
            OnPropertyChanged(new PropertyChangedEventArgs("DevRssi"));
            }
        }
        private double distance;//距离

        public double Distance
        {
            get { return distance; }
            set { distance = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Distance"));
            }
        }

        private string recTime;//接收时间

        public string RecTime
        {
            get { return recTime; }
            set { recTime = value;
            OnPropertyChanged(new PropertyChangedEventArgs("RecTime"));
            }
        }
        private string voltage;//电压

        public string Voltage
        {
            get { return voltage; }
            set { voltage = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Voltage"));
            }
        }
        
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, e);
            }
        }
    }

             

         

猜你喜欢

转载自blog.csdn.net/whjhb/article/details/85246497