WPF 神话之Binding对象Word文档格式.docx
- 文档编号:21901010
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:21.22KB
WPF 神话之Binding对象Word文档格式.docx
《WPF 神话之Binding对象Word文档格式.docx》由会员分享,可在线阅读,更多相关《WPF 神话之Binding对象Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
我们只要把源拿到,更改后,重新赋给我们的控件就好了。
这个是可行
的,但不是我们今天要说的。
好了我们来分析下。
第一个需求很简单。
只是把某个对象给控件。
但是第二个需求了?
首先要知道我们的Binding是很智能的。
只要源
的数据一旦发生了改变。
目标显示也会改变。
怎么来改变了,肯定有个事件去监听着,我们的源数据。
那么这个监
听是什么了,我们要如何来写了。
请看我定义的一个类:
namespaceWpfBinding
{
/*
*1、首先使用属性通知接口(INoticePropertyChanged)
*2、该接口中只有一个事件属性
*3、在属性改变的Set方法中,调用该事件方法,参数有两个,第一个是发生的类,第二个是属性名
*/
publicclassStudent:
INotifyPropertyChanged
#regionINotifyPropertyChanged成员
//通过这个事件,我们就能很好控制我们的属性了变更了。
publiceventPropertyChangedEventHandlerPropertyChanged;
#endregion
privatestringname;
publicstringName
get{
returnthis.name;
}
set{
this.name=value;
if(this.PropertyChanged!
=null){
//只要属性发生改变。
就会通知我们的目标。
目标也同样更新
this.PropertyChanged.Invoke(this,newPropertyChangedEventArgs("
Name"
));
好。
我们来应用:
界面设计很简单:
<
TextBoxBorderBrush="
Black"
Margin="
5"
x:
Name="
txtStuName"
/>
ButtonContent="
改变属性"
Width="
100"
Height="
30"
Click="
Button_Click"
只有一个空间一个按钮。
在后台文件中我们来做数据的绑定:
为了方便说明,我们定义一个全局的Student对象,变量名为stu.
在窗体构造函数里面,我们来看看如果做数据绑定。
*使用Binding来实现数据绑定。
*1、声明数据源。
这里就是我们的Student类了。
*2、声明Binding对象。
*3、把Binding对象的数据源和我们Student关联起来
*4、指定绑定的访问路径,也就是要绑定的属性了
*5、让绑定的数据同我们的UI关联起来。
stu=newStudent();
stu.Name="
我是"
;
/*第一种绑定的方法(这个看起来代码有点多啊。
还有简单的方法我们来看看这种方式)
Bindingbind=newBinding();
//申明一个Binding对象
bind.Source=stu;
//我们的数据源就是我们Student实例。
这里是制定源
bind.Path=newPropertyPath("
);
//这里是制定要绑定源中的那个属性
BindingOperations.SetBinding(this.txtStuName,TextBox.TextProperty,bind);
//这里是让我们的源和Target关联起来
//第二种绑定的方法这个很简洁。
我就不说明了。
和上面其实是一样的。
this.txtStuName.SetBinding(TextBox.TextProperty,newBinding("
){Source=stu});
上面就是数据绑定完毕了。
下面我们来看看按钮里面我们做了什么
privatevoidButton_Click(objectsender,RoutedEventArgse)
stu.Name=stu.Name+"
Tom"
其他什么也没有做。
当我们运行起来,点击按钮,我们的文本框就变成"
我是Tom"
;
这里是不是很神奇。
大家可以去试验下。
下面的这个例子是为了验证数据绑定是双向的。
试验是这样的。
在窗体上有个文本框,滑块。
滑动滑块,文本中数据会改变。
我们改变文本框的数据,滑块也会改变。
相信大家
在脑海里面有一个印象了。
我们直接看代码的实现:
首先看XAML文件的布局。
也很简单。
一个TextBox,一个Slider。
我的注释写的都很清楚哦。
!
--
把控件作为Binding的源来实现数据绑定
1、在显示的属性中使用Binding形式如下:
{BindingPath=Value,ElementName=控件名}
2、这里的Path指代要数据源的属性
3、这里的实现有几种形式:
A、利用Binding的扩展方法。
如:
{BindingPath=Value,ElementName=silder}
B、利用Binding的构造方法。
其可以直接接受一个Path参数如:
{BindingValue,ElementName=silder}
C、后台使用代码来实现如:
this.txtSilder.SetBinding(TextBox.TextProperty,newBinding("
Value"
){ElementName="
silder"
});
在这里,因为在cs中,我们可以直接访问控件。
所以我们可以不使用ElementName来进行banding。
可以这样来写:
this.txtSilder.SetBinding(TextBox.TextProperty,newBinding("
){Source=this.silder});
4、关于Binding还有几种属性:
1、BindingMode.(TwoWay,OneWay,OnTime,OneWayToSource和Default)即更新模式
2、UpdateSourceTrigger:
(PropertyChnaged,LostFocus,Explicit,Default)
-->
txtSilder"
>
/TextBox>
SliderBorderBrush="
LightBlue"
Minimum="
0"
Maximum="
/Slider>
看了注释我们应该知道有很多种Binding方法了。
这几种方法我都试过。
所以现在保留下来的文件时使用最后一个方法。
后台大家也知道什么方法了啊。
就是:
//采用控件作为另一个控件的数据源
){Source=this.silder,
UpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged});
其他什么代码就没有了。
就是这么简单。
大家去试验下。
今天我们来探讨的问题,有两个:
一是:
关于Binding的几个属性问题(Path,Source)二是:
关于几种数据源问题。
首先来看第一个问题:
第一个属性:
Source:
这个数据源有很多种,在接下来我会大家提供几个数据源的例子信息。
第二个属性:
Path,这里将要重点介绍这个属性
在XAML文件中写Binding的时候。
这里的Path是可以不用写的。
比如说:
GridViewColumnHeader="
Age"
220"
DisplayMemberBinding="
{BindingAge}"
/GridViewColumn>
这句话是说Binding一个数据源中的Age属性。
这里的Path我是省略掉的。
这种写法大家要习惯。
再来看一种特殊情况。
Path采用.来使用的类型。
我们来看看这样的一个小例子。
Windowx:
Class="
WpfBinding.MainWindow"
xmlns="
xmlns:
x="
sys="
clr-namespace:
System;
assembly=mscorlib"
//这里我们使用了资源。
所以要引用这个命名空间,请注意了。
Title="
MainWindow"
800"
StackPanel>
--定义资源-->
StackPanel.Resources>
sys:
Stringx:
Key="
myResource"
菩提本无树,明镜亦非台。
本来无一物,何处惹尘埃。
/sys:
String>
/StackPanel.Resources>
没有Path的Binding.
1、如果一个数据源本来就是数据,如string,int等。
我们可以不用指定Path.
2、如我们下面的写法
TextBlockx:
txtMsg"
TextWrapping="
Wrap"
Text="
{BindingPath=.,Source={StaticResourceResourceKey=myResource}}"
Background="
/StackPanel>
/Window>
这个例子的呈现效果就是。
我们看到了资源的信息。
会显示出来。
这里的Binding我们还可以写成这样{Binding.,Source={StaticResourceResourceKey=myResource}}或者{BindingSource={StaticResourceResourceKey=myResource}}
接下来我们来探讨第二个问题。
关于数据源的问题。
1.DataContext这个属性是被定义在FrameworkElement类中的,而这个类是WPF控件的一个基类。
所以我们WPF控件都有这个属性。
如果我们在WPF中的某个控件上设置了Path属性,但是没有给定其的Source属性的话。
WPF会自动在该控件树上向上查找。
把第一个找到的DataContext作为自己的数据源。
2、集合作为数据源的例子。
代码清单如下:
XAML:
--DataSource的指定这里采用Grid来做布局-->
GridBackground="
Grid.RowDefinitions>
RowDefinitionHeight="
Auto"
/Grid.RowDefinitions>
TextBoxx:
txtStudentID"
BorderBrush="
2"
ListBoxx:
lstStudent"
Grid.Row="
ListBox.ItemTemplate>
--使用模版来进行数据banding-->
DataTemplate>
StackPanelOrientation="
Horizontal"
TextBlockText="
{BindingPath=Id}"
{BindingPath=Name}"
/DataTemplate>
/ListBox.ItemTemplate>
/ListBox>
/Grid>
来看看后台代码
在后台的初始化中添加这段代码。
这里有个Member类。
该类里面就两个属性。
一个是Id,一个是Name.请各位自己添加一个类就好。
List<
Member>
lstMember=newList<
(){
newMember("
0001"
"
wy"
),
0002"
love"
0003"
hu"
0004"
bing"
)
};
this.lstStudent.ItemsSource=lstMember;
//这里是将我们的数据源给我们的ListBox。
关于这点大家应该都很清楚。
winform大家应该接触过。
//this.lstStudent.DisplayMemberPath="
//主要来看这段代码。
这段代码的意思是
//把我们的ListBox作为我们的数据源。
目标是我们的文本框。
//绑定的对象属性是该数据源中的Id,这里是用的SelectedItem.Id
//也就是说选中行的Id.从这里我们就清楚了,这个例子不但进行了数据banding。
而且还进行选中行的数据Id同其他控件进行关联
//请大家运行下代码看看效果。
Bindingbind=newBinding("
SelectedItem.Id"
){Source=this.lstStudent};
this.txtStudentID.SetBinding(TextBox.TextProperty,bind);
3.我们再来看另外几个数据源的情况。
WpfBinding.BindingWin"
BindingWin"
600"
ListViewx:
lvStudent"
200"
ListView.View>
GridView>
ID"
150"
{BindingID}"
{BindingStuName}"
/GridView>
/ListView.View>
/ListView>
DockPanel>
Buttonx:
btnFromDataTable"
Content="
从DataTable获取数据"
btnFromList_Click"
/Button>
btnFromXml"
从XML中获取数据"
btnObjectDataProvider"
ObjectDataProvider"
ObjectDataProvider_Click"
130"
/DockPanel>
这几个例子会用到一个辅助类
publicclassMyStudent{
publicstringID{get;
set;
}
publicstringStuName{get;
publicintAge{get;
publicMyStudent(stringid,stringname,intage)
this.ID=id;
this.StuName=name;
this.Age=age;
publicMyStudent()
//TODO:
Completememberinitialization
A.来看看DataTable作为数据源的例子
在按钮btnFromDataTable事件中添加如下代码
DataTabledt=newDataTable();
dt.Columns.Add("
typeof(string));
typeof(int));
DataRowrow1=dt.NewRow();
row1["
]="
Wy"
]=25;
DataRowrow2=dt.NewRow();
row2["
Test121"
]=24;
DataRowrow3=dt.NewRow();
row3["
Info001"
dt.Rows.Add(row1);
dt.Rows.Add(row2);
dt.Rows.Add(row3);
//记住这里一定要用DefaultView.请大家注意了。
大家可以试验下直接把dt赋值过去的效果。
this.lvStudent.ItemsSource=dt.DefaultView;
以上还有一种写法
this.lvStudent.DataContext=dt;
this.lvStudent.SetBinding(ListView.ItemSourceProperty,NewBinding());
使用这种方法。
Binding会自动找到DefaultView
B.使用XML文件作为数据源的形式我这里有个XML文件。
我是放在编译目录下的。
也就是和我们生成的exe文件在同一个目录。
?
xmlversion="
1.0"
encoding="
utf-8"
StudentList>
StudentId="
001"
Name="
Li"
Age="
25"
/Student>
002"
Ming"
24"
003"
Wang"
20"
004"
Hu"
005"
Xiao"
/StudentList>
后台的代码如下:
//首先是加载我们的XML文件的内容,然后将这个XDocument文件进行数据的提取
XDocumentdoc=XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory+"
Xml.xml"
this.lvStudent.ItemsSource=fromelementindoc.Descendants("
Student"
)//寻找Student节点
selectnewMyStudent(){
ID=element.Attribute("
Id"
).Value,
StuName=element.Attribute("
Age=Convert.ToInt32(element.Attribute("
).Value)
这里大家可以尝试着试验下。
还有一种加载XML文件的方式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WPF 神话之Binding对象 神话 Binding 对象