前言:WPF数据绑定技术有效的提高了程序的容错率,可以最大程度的保持程序的健壮性,从而降低程序在使用过程中崩掉的可能性。

接下来,我将分享一下我在写测量程序过程中所用到的数据绑定方面的知识

首先,我所用到的数据绑定的基本原理

如上图所示,我们通过建立一个类,我们给它取名为视图模型,通过这个类里面的属性可以将我们的后台与界面实时的联系起来,以保证数据的实时更新,我们主要通过基类中的属性来进行数据绑定。

在界面设计代码中,我们用到Binding属性来进行数据绑定,代码如下所示

 1 <Window x:Class="GaussProj.AzimuthWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:GaussProj"
7 mc:Ignorable="d"
8 Title="坐标方位角计算" Height="380" Width="500">
9 <Window.Resources>
10 <Style TargetType="TextBox">
11 <Setter Property="Background" Value="AliceBlue"/>
12 <Setter Property="VerticalAlignment" Value="Center"/>
13 </Style>
14 <Style TargetType="TextBlock">
15 <Setter Property="Background" Value="AliceBlue"/>
16 <Setter Property="VerticalAlignment" Value="Center"/>
17 <Setter Property="HorizontalAlignment" Value="Right"/>
18 </Style>
19 </Window.Resources>
20 <Grid Margin="20">
21 <Grid.RowDefinitions>
22 <RowDefinition Height="40*"/>
23 <RowDefinition Height="40*"/>
24 <RowDefinition Height="50*"/>
25 <RowDefinition Height="30*"/>
26 </Grid.RowDefinitions>
27 <GroupBox Header="起点">
28 <Grid>
29 <Grid.ColumnDefinitions>
30 <ColumnDefinition Width="40*"/>
31 <ColumnDefinition Width="60*"/>
32 <ColumnDefinition Width="40*"/>
33 <ColumnDefinition Width="60*"/>
34 <ColumnDefinition Width="40*"/>
35 <ColumnDefinition Width="60*"/>
36 </Grid.ColumnDefinitions>
37 <TextBlock Text="点名:" Margin="2" Grid.Row="0" Grid.Column="0"/>
38 <TextBox x:Name="A_Name" Grid.Row="0" Grid.Column="1" Text="{Binding PA.Name}" Background="AliceBlue" Margin="3"/>
39
40 <TextBlock Text="X=" Margin="2" Grid.Row="0" Grid.Column="2"/>
41 <TextBox x:Name="AX_TextBox" Grid.Row="0" Grid.Column="3" Text="{Binding PA.X}" Background="AliceBlue" Margin="3"/>
42 <TextBlock Text="Y=:" Margin="2" Grid.Row="0" Grid.Column="4"/>
43 <TextBox x:Name="AY_TextBox" Grid.Row="0" Grid.Column="5" Text="{Binding PA.Y}" Background="AliceBlue" Margin="3"/>
44 </Grid>
45 </GroupBox>
46
47 <GroupBox Header="方向点" Grid.Row="1">
48 <Grid>
49 <Grid.ColumnDefinitions>
50 <ColumnDefinition Width="40*"/>
51 <ColumnDefinition Width="60*"/>
52 <ColumnDefinition Width="40*"/>
53 <ColumnDefinition Width="60*"/>
54 <ColumnDefinition Width="40*"/>
55 <ColumnDefinition Width="60*"/>
56 </Grid.ColumnDefinitions>
57 <TextBlock Text="点名:" Margin="2" Grid.Row="1" Grid.Column="0"/>
58 <TextBox x:Name="B_Name" Grid.Row="1" Grid.Column="1" Text="{Binding PB.Name}" Background="AliceBlue" Margin="3"/>
59
60 <TextBlock Text="X=" Margin="2" Grid.Row="1" Grid.Column="2"/>
61 <TextBox x:Name="BX_TextBox" Grid.Row="1" Grid.Column="3" Text="{Binding PB.X}" Background="AliceBlue" Margin="3"/>
62
63 <TextBlock Text="Y=:" Margin="2" Grid.Row="1" Grid.Column="4"/>
64 <TextBox x:Name="BY_TextBox" Grid.Row="1" Grid.Column="5" Text="{Binding PB.Y}" Background="AliceBlue" Margin="3"/>
65
66 </Grid>
67 </GroupBox>
68
69 <GroupBox Header="计算成果" Grid.Row="2">
70 <Grid>
71 <Grid.ColumnDefinitions>
72 <ColumnDefinition Width="105*"/>
73 <ColumnDefinition Width="120*"/>
74 </Grid.ColumnDefinitions>
75 <Grid.RowDefinitions>
76 <RowDefinition Height="30*"/>
77 <RowDefinition Height="30*"/>
78 </Grid.RowDefinitions>
79 <TextBlock d:Text="坐标方位角:" Name="AZ_Name" Text="{Binding AzName}" Grid.Row="0" Grid.Column="0" Margin="12"/>
80 <TextBox x:Name="Az" Grid.Row="0" Grid.Column="1" Text="{Binding AzValue}" Background="AliceBlue" Margin="3"/>
81
82 <TextBlock Text="距离:" Grid.Row="1" Grid.Column="0" Margin="12"/>
83 <TextBox x:Name="Distance" Grid.Row="1" Grid.Column="1" Text="{Binding Dist}" Background="AliceBlue" Margin="3"/>
84 </Grid>
85 </GroupBox>
86 <StackPanel Orientation="Horizontal" Grid.Row="3" HorizontalAlignment="Center">
87 <Button x:Name="Calculate" Content="计算" BorderThickness="3" BorderBrush="YellowGreen" Width="100" Click="Calculate_Click" Margin="10"/>
88 <Button x:Name="Exit" BorderThickness="3" BorderBrush="YellowGreen" Click="Exit_Click" Width="100" Content="关闭" Margin="10"/>
89 </StackPanel>
90 </Grid>
91 </Window>

数据绑定模型类的设计代码如下:

  1 {
2 /// <summary>
3 ///
4 /// </summary>
5 public class AzimuthWindowVM : NotifyPropertyObject
6 {
7 //public event PropertyChangedEventHandler PropertyChanged;
8 //public void RaisePropertyChanged(string propertyName)
9 //{
10 // if (PropertyChanged != null)
11 // {
12 // PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
13 // }
14 //}
15
16 private Point pA = new Point("A",0.0,0.0);
17 public Point PA
18 {
19 get { return pA; }
20 //set
21 //{
22 // pA = value;
23 // RaisePropertyChanged("PA");
24 // //if (PropertyChanged != null)
25 // //{
26 // // PropertyChanged.Invoke(this, new PropertyChangedEventArgs("AName"));
27 // //}
28 //}
29 }
30 //private double xA;
31
32 //public double XA
33 //{
34 // get { return xA; }
35 // set
36 // {
37 // xA = value;
38 // RaisePropertyChanged("XA");
39 // //if (PropertyChanged != null)
40 // //{
41 // // PropertyChanged.Invoke(this, new PropertyChangedEventArgs("XA"));
42 // //}
43 // }
44 //}
45
46 //private double yA;
47 //public double YA
48 //{
49 // get { return yA; }
50 // set
51 // {
52 // yA = value;
53 // RaisePropertyChanged("YA");
54 // //if (PropertyChanged != null)
55 // //{
56 // // PropertyChanged.Invoke(this, new PropertyChangedEventArgs("YA"));
57 // //}
58 // }
59 //}
60
61 private Point pB = new Point("B",1.0,1.0);
62 public Point PB
63 {
64 get { return pB; }
65 //set
66 //{
67 // pB = value;
68 // RaisePropertyChanged("PB");
69 // //if (PropertyChanged != null)
70 // //{
71 // // PropertyChanged.Invoke(this, new PropertyChangedEventArgs("BName"));
72 // //}
73 //}
74 }
75
76 //private double xB;
77
78 //public double XB
79 //{
80 // get { return xB; }
81 // set
82 // {
83 // xB = value;
84 // RaisePropertyChanged("XB");
85 // //if (PropertyChanged != null)
86 // //{
87 // // PropertyChanged.Invoke(this, new PropertyChangedEventArgs("XB"));
88 // //}
89 // }
90 //}
91
92 //public double yB;
93 //public double YB
94 //{
95 // get { return yB; }
96 // set
97 // {
98 // yB = value;
99 // RaisePropertyChanged("YB");
100 // //if (PropertyChanged != null)
101 // //{
102 // // PropertyChanged.Invoke(this, new PropertyChangedEventArgs("YB"));
103 // //}
104 // }
105 //}
106
107
108 private string azName = "A001->B004的坐标方位角";
109 public string AzName
110 {
111 get { return azName; }
112 set { azName = value; RaisePropertyChanged("AzName"); }
113 }
114
115 private String azValue;
116 public String AzValue
117 {
118 get { return azValue; }
119 set { azValue = value; RaisePropertyChanged("AzValue"); }
120 }
121 private double dist;
122 public double Dist
123 {
124 get { return dist; }
125 set { dist = value; RaisePropertyChanged("Dist"); }
126 }
127
128 public void Caculate()
129 {
130 var ad = FZY.SurMath.AzimuthDistance(PA.X, PA.Y, PB.X, PB.Y);
131 AzValue = FZY.SurMath.RADtoDMSString(ad.az);
132 Dist = ad.d;
133 AzName = $"{PA.Name}->{PB.Name}的坐标方位角";
134 }
135 }
136 }

很明显,这个类是从NotifyPropertyObject类继承过来的

 1 using System.ComponentModel;
2
3 namespace FZY
4 {
5 public class NotifyPropertyObject : INotifyPropertyChanged
6 {
7 public event PropertyChangedEventHandler PropertyChanged;
8 public void RaisePropertyChanged(string propertyName)
9 {
10 if (PropertyChanged != null)
11 {
12 PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
13 }
14 }
15 }
16 }

在这里,我们用到了INotifyPropertyChanged接口的一些功能。

总结:WPF数据绑定技术实质用到的就是C#中的属性的知识,我们通过set访问器来实时写入新值,这足以显示出属性的重要性,因此,熟练运用属性知识对数据绑定来说非常重要。

C#-WPF数据绑定基础(一)的更多相关文章

  1. WPF 数据绑定基础

    纯理论,可能会枯燥. .net 技术群: 199281001 ,欢迎加入. 1.目标对象一定是派生自DependencyObject的对象,并且目标属性必须是依赖属性,否则数据绑定操作将会失   败. ...

  2. WPF 数据绑定 1_1 基础知识&绑定到元素属性

    A.数据绑定基础: 数据源对象:WPF将从该对象中提取信息,交由目标对象进行显示. 目标对象:从数据源中提取信息,并赋给该对象的属性. B.绑定到元素属性 最简单的绑定情形则是将一个源对象指定为一个W ...

  3. Windows 8实例教程系列 - 数据绑定基础实例

    原文:Windows 8实例教程系列 - 数据绑定基础实例 数据绑定是WPF,Silverlight以及Windows Phone应用开发中最为常用的开发技术,在基于XAML的Windows Stor ...

  4. 微软原文翻译:适用于.Net Core的WPF数据绑定概述

    原文链接,大部分是机器翻译,仅做了小部分修改.英.中文对照,看不懂的看英文. Data binding overview in WPF 2019/09/19 Data binding in Windo ...

  5. WPF 数据绑定Binding

    什么是数据绑定? Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及与数据交互. 通过数据绑定,您可以对两个不同对象 ...

  6. WPF数据绑定Binding(二)

    WPF数据绑定Binding(二) 1.UI控件直接的数据绑定 UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上. ...

  7. WPF——数据绑定(一)什么是数据绑定

    注意:本人初学WPF,文中可能有表达或者技术性问题,欢迎指正!谢谢! 一:什么是数据绑定? “Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简 ...

  8. 剖析WPF数据绑定机制

    引言 WPF框架采取的是MVVM模式,也就是数据驱动UI,UI控件(Controls)被严格地限制在表示层内,不会参与业务逻辑的处理,只是通过数据绑定(Data Binding)简单忠实地表达与之绑定 ...

  9. WPF 10天修炼 第十天- WPF数据绑定

    WPF数据绑定 数据绑定到元素属性是将源对象指定为一个WPF元素,并且源属性是一个依赖属性,依赖属性内置了变更通知.当改变源对象依赖属性值之后,绑定目标可以立即得到更新,开发人员不需要手动编写响应事件 ...

随机推荐

  1. 【vue】获取异步加载后的数据

    异步请求的数据,对它做一些处理,需要怎么做呢?? axios 异步请求数据,得到返回的数据, 赋值给变量 info .如果要对 info 的数据做一些处理后再赋值给 hobby ,直接在 axios ...

  2. DIVIDEMIX: LEARNING WITH NOISY LABELS AS SEMI-SUPERVISED LEARNING

    论文阅读: DIVIDEMIX: LEARNING WITH NOISY LABELS AS SEMI-SUPERVISED LEARNING 作者说明 版权声明:本文为博主原创文章,遵循CC 4.0 ...

  3. spring boot log4j2 最佳实践

    为什么选择 log4j2 Log4j2 使用了 LMAX Disruptor 库.在多线程场景中,异步 Logger 的吞吐量比 Log4j 1.x 和 Logback 高 18 倍,延迟低几个数量级 ...

  4. 【Java虚拟机2】Java类加载机制

    前言 JAVA代码经过编译从源码变为字节码,字节码可以被JVM解读,使得JVM屏蔽了语言级别的限制.才有了现在的kotlin.Scala.Clojure.Groovy等语言. 字节码文件中描述了类的各 ...

  5. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  6. 【c++ Prime 学习笔记】第1章 开始

    1.1 编写一个简单的程序 int main() { return 0; } 函数 包含4部分: 返回类型(return type) 函数名(function name) 形参列表(parameter ...

  7. vue3.x非兼容的变更

    走马观花似的看看从vue2.x开始到vue3.x的一些非兼容性的变更,这样在将来升级过程中遇到那些奇奇怪怪的不能用的时候,就会很容易解决啦. 全局 API 全局 Vue API 已更改为使用应用程序实 ...

  8. Java:NIO 学习笔记-2

    Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...

  9. UltraSoft - Beta - Scrum Meeting 3

    20200519会议纪要 Date: May 19th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 暂无 Liuzh 前端 暂无 Kkkk 前端 完成了前端 ...

  10. GitHub Universe 2021|MS Reactor 邀你共聚年度盛会

    GitHub Universe 2021 将于2021年10月27-28日(PDT)在线直播,MS Reactor 将与 CSDN 合作进行转播,与你一同观看这场全球开发者盛会. 关于 GitHub ...