1. 有一个类,都是 int string double 类型的字段,类似于这样的
public class Laser
{
public double Temp = 0;
public double CurrentSet = 500;
public double Current = 0;
}
2. 在一个线程里,给这些字段赋值,值是实时更新的
3. 有一个wpf的用户控件
问题是,怎么将这些值赋值给用户控件上的控件呢?
在winform里,只能 Invoke ,给控件赋值,类似于这样的:
if (buffer[3] == 0x01)
{
laser.Temp= ((double)((buffer[4] << 8) | buffer[5])) / 1000;
if ((LaserForm!= null) && LaserForm.IsHandleCreated)
{
LaserForm.textBoxTemp.Invoke((MethodInvoker)delegate ()
{
LaserForm.textBoxXSourceRealTimeTempNow.Text = laser.Temp.ToString();
});
}
}
else if (buffer[3] == 0x02)
{
laser.Current = ((double)((buffer[4] << 8) | buffer[5])) / 10;
if ((LaserForm!= null) && LaserForm.IsHandleCreated)
{
LaserForm.textBoxCurrent.Invoke((MethodInvoker)delegate ()
{
Laser.textBoxCurrent.Text = laser.Current.ToString();
});
}
}
其中,LaserForm 是 winform界面的实例
如果有20个textbox,就都得这样写,不好维护。
wpf 的 Binding 就能很好解决这个问题。
现在将 Laser 类改一下,实现 INotifyPropertyChanged 接口
public class Laser
{
private double temp = 0;
public double Temp
{
get { return temp; }
set { temp= value; OnPropertyChanged(); }
}
private double currentSet= 0;
public double CurrentSet
{
get { return currentSet; }
set { currentSet = value; OnPropertyChanged(); }
}
private double current= 500;
public double Current
{
get { return current; }
set { current= value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name=null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
在用户控件的Loaded事件里,给DataContext 赋值对象
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = laser;
}
在用户控件的xaml里,绑定对象就行了
<TextBox Text="{Binding Temp }" />
<TextBox Text="{Binding CurrentSet}"/>
<TextBox Text="{Binding Current}"/>
这样做的好处是,不用在多线程里,找个页面,再给页面的控件一个一个赋值,还能实时更新数据。赋值代码是这样的
if (buffer[3] == 0x01)
{
laser.Temp= ((double)((buffer[4] << 8) | buffer[5])) / 1000;
}
else if (buffer[3] == 0x02)
{
laser.Current = ((double)((buffer[4] << 8) | buffer[5])) / 10;
}
版权声明:本文为orangapple原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。