WPF學習(19)-資料繫結
阿新 • • 發佈:2018-12-26
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);
}
}
}