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