1. 程式人生 > >WPF學習(19)-資料繫結

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);
            }
        }
    }