WPF Binding 实时更新页面数据

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

orangapple

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值