WPF基础知识—Binding和三⼤解耦和利器:路由事件、依赖属性和命令
注:本⽂章全部出⾃我阅读《深⼊浅出WPF》并实际应⽤之后的想法和记录,感谢原作者刘铁猛⽼师
1 概述
WPF是微软继MFC之后推出的界⾯框架,Windows10主打的UWP界⾯框架就是基于WPF优化⽽来的。标签语⾔XAML(我个⼈读作
Ik’s-am(ə)l)在Windows窗体应⽤程序开发中,起到了与BS结构中的与HTML+CSS+Javascript⼀样的作⽤。这类标签语⾔的好处就是可以很轻松的和后台逻辑代码解耦和。
WPF中的XAML⽂件在.NET框架当中的位置:
由于XAML被设计⽤来专门编写Windows窗⼝程序的,与BS架构区分客户端和服务器端不同,所以与HTML在浏览器上被解析不
同,XAML也有⾃⼰的编译器
XAML与CS⽂件⼀样,也有⾃⼰的编译器,同样被编译成中间语⾔在CLR平台上共同运⾏
所以:
⼀个XAML可以结合多个.cs⽂件共同编译
XAML能访问的.cs也能访问,反之依然
1.1 应该明确的基础知识点
1.1.1 XAML⽂件头中都是什么意思
当我们新建了⼀个WPF程序之后,VS会⾃动为我们⽣成⼀个MainWindow.xaml以及它对应的MainWindow.cs。正如概览中所说,XAML 在C#程序中负责⽤户UI并且有⾃⼰的编译器,它与⼀个或多个***.cs共同组成了⼀个windows窗体,并且与C#代码⼀样,也可以引⽤命名空间
根据上边的图⽰,可以很清楚的体会XAML在C#程序中所在的位置了,它可以很轻松的和***.cs⽂件打通关系
1.1.2 WPF当中的Resource(资源)
如果对MFC熟悉的话,应该知道,MFC中⾮常重要的**.rc⽂件,这个⽂件主要保存了MFC界⾯当中的所有和显⽰有关的内容
WPF也部分的继承了这⼀点,⼏乎所有的控件,都有⾃⼰的Recource集(包括最底层的Window),Resource属性都可以包含以下前端显⽰可以包括的内容:
⽂本、对象模板(控件组合)、样式(CSS)、笔刷、图⽚、⾳频、视频、等等~~~
1.1.3 WPF当中的控件类型
以上这所有的控件分类,⼤致分为了布局控件、内容控件和条⽬控件,这个控件的分类的详细说明我会在后续继续详细说明的
1.2 x名称空间
x名称空间可以称之为“XAML名称空间”,在这个名称空间内,通常可以访问到所有XAML的通⽤属性,⽤这些属性来控制⽤户界⾯上的所有控件。
1.2.1 x:Name
为XAML的⼀个控件实例起名字,虽然在默认的命名空间中也有Name可以使⽤,但是x:Name适⽤性更⼴,建议统⼀使⽤x:Name
<StackPanel>
<TextBox x:Name="text" Text="{Binding m_Name}" Height="50"></TextBox>
<Button Click="Button_Click" Height="50">Button</Button>
</StackPanel>
private void Button_Click(object sender, RoutedEventArgs e)
{
}
1.2.2 x:Key
是⼀个Key-Value键值对,通常⽤于控件的Resource当中,这个Key就是这个资源的名字
<Style x:Key="BlueButton" TargetType="Button">
<Setter Property="Foreground" Value="Blue"/>
</Style>
1.2.3 x:Type
x:Type相当于指定控件中的某⼀个属性对应的具体是哪个类型
这个在使⽤的时候,有以下⼏种场景:
1、在Style当中,指定这个Style的⽬标类型
<Style x:Key="ScrollBarBaseStyle" TargetType="{x:Type ScrollBar}"/>
2、在⾃定义控件当中,往往有⼀些⾃定义的类型
⽐如⾃定义的TabControl当中,页签所对应的内容,如下例就是
<core:LiveExplorerTreeViewItem Header="Category Ordering"
SampleType="{x:Type samples:PropertyGrid.Views.PropertyGridCategoryOrderView}"/>
public static readonly DependencyProperty SampleTypeProperty =
DependencyProperty.Register("SampleType",typeof(Type),
typeof(LiveExplorerTreeViewItem),new UIPropertyMetadata(null));
public Type SampleType
{
get
{
return(Type)GetValue(SampleTypeProperty);
}
set
{
SetValue(SampleTypeProperty,value);
}
}
WPF核⼼MVVM数据驱动模式中重要⼀环:Binding
1.3 Binding
Binding是xaml和cs沟通的桥梁,Binding的对象就是所有cs代码对外暴露的属性或⽅法的返回值++Binding的应⽤直接反映了MVVM架构的思想++,具体的MVVM架构可参考下⼀篇⽂章
public class Binding : BindingBase
{
public Binding(string path);
…………
}
Binding关联的核⼼:
Binding关联核⼼——DataContext:
DataContext的类型是Object,可以关联任何的类型实例。每个控件都有⾃⼰的DataContext属性,只要将该属性赋⼀个实例值,这个控件的每⼀个显⽰属性就都可以使⽤binding来关联这个实例的属性了
在MSDN上是这么说的:
获取或设置 FrameworkElement 参与数据绑定时的数据上下⽂。
数据上下⽂是对象可从对象关系层次结构中的后续⽗对象继承数据绑定信息的概念。
数据上下⽂中最重要的⼀个层⾯就是⽤于数据绑定的数据源。DataContext 的典型⽤法是将其直接设置为数据源对象。此数据源可以是类的实例,例如业务对象。或者您可以作为可观测集合创建⼀个数据源,从⽽让数据上下⽂环境启⽤对⽀持集合的更改进⾏检测。如果数据源是由⼀个也包含在项⽬中的库定义的,设置 DataContext 通常也伴随有在 ResourceDictionary 中将数据源作为⼀个关键资源进⾏初始化,然后在含有 StaticResource 引⽤的 XAML 中设置 DataContext。
1.3.1 使⽤Binding关联
1、使⽤binding关联XAML元素和C#抽象类的属性
binding主要⽤来在三层软件架构当中使逻辑层和展⽰层进⾏通信的。
所以Data binding可以剥离显⽰层与逻辑层,使之解耦和,这也是MVVM框架的⼀个基础核⼼(下⼀节会详细讲解)
// 抽象类当中的属性;
private string _brithday;
public string m_Birthday
{
get
{htmlbutton属性
return _brithday;
}
set
{
_brithday =value;
RaisePropertyChanged("m_Birthday");
}
}
// 前端的显⽰控件;
<TextBox x:Name="Birthday" Height="50"></TextBox>
<!--或者通过前端的binding实现-->
<TextBox x:Name="Birthday" Height="50" Text={Binding path="m_Birthday"}></TextBox>
// 在初始化的时候,设置关联;
this.Birthday.SetBinding(TextBox.TextProperty,new Binding("m_Birthday"){ Source = PageMain });
2、使⽤Binding和ObjectDataProvider关联XAML和C#抽象类中的⽅法返回值
ObjectDataProvider odp =new ObjectDataProvider();
odp.ObjectInstance =new Calc();
odp.MethodName ="Add";
odp.MethodParameters.Add("0");
odp.MethodParameters.Add("0");
// 这个控件的Text属性,通过odp关联了⽅法的第⼀个参数;
this.CalcX.SetBinding(TextBox.TextProperty,new Binding("MethodParameters[0]"){
Source = odp,
BindsDirectlyToSource =true,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
});
// 这个控件的Text属性,通过odp关联了⽅法的返回值;
this.CalcRes.SetBinding(TextBox.TextProperty,new Binding(".")
{
Source = odp
});
3、使⽤binding关联两个XAML元素
binding也可以关联同样是前端的元素
<Label>控件绑定前端元素:</Label>
<TextBox Text="{Binding ElementName=slider1, Path=Value, Mode=OneWay}"></TextBox>
<Slider x:Name="slider1" Maximum="20"></Slider>
使⽤binding关联ItemControl类型的控件
前边的简单例⼦都是关联了只具有单⼀属性的控件,⽐如Text这样的控件,⽽类似treeview或者ListBox这样的控件则需要⽤⼀个容器与之匹配

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。