WPF Binding 实时更新页面数据

  • Post author:
  • Post category:其他


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 版权协议,转载请附上原文出处链接和本声明。