博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无废话WPF系列8:绑定Binding及模式
阅读量:6411 次
发布时间:2019-06-23

本文共 2037 字,大约阅读时间需要 6 分钟。

绑定,就是把一个对象属性的值绑定在别的对象的属性上

1. 默认绑定

public class Company 

    public string Name { get; set; } 

 

XAML代码

1
2
3
4
5
<StackPanel x:Name=
"stackPanel"
>
    
<TextBox x:Name=
"txtName" 
Text=
"{Binding Path=Name}"
></TextBox>
    
<TextBox x:Name=
"txtName2" 
Text=
"{Binding  Path=Name}"
></TextBox>
    
<Button Click=
"Button_Click"
>Ok</Button>
</StackPanel>
后端代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace 
DeepXAML
{
    
public 
partial 
class 
MainWindow : Window
    
{
        
Company mCompany;
        
public 
MainWindow()
        
{
            
InitializeComponent();
            
mCompany =
new 
Company { Name =
"Microsoft" 
};
            
this
.stackPanel.DataContext = mCompany;
        
}
        
private 
void 
Button_Click(
object 
sender, RoutedEventArgs e)
        
{           
            
MessageBox.Show(
this
.mCompany.Name);
            
mCompany.Name =
"Sun"
;
        
}       
    
}
}

 

我们把第一个文本框的值改为IBM,并点击按钮

 

这个结果说明,我们绑定到一个普通的UI上时,前端的(绑定的目标)改变会时绑定的源改变。但我们第二次点击按钮时,出现如下的图

2. 双向绑定

上图后台使用代码改变对象的属性值,但前端绑定的值并未改变。那么如何让后台属性的变化通知到绑定的UI控件,让UI控件更新值呢?我们需要实现一个接口,现在我们对Company做如下改造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace 
DeepXAML
{
   
public  
class 
Company:INotifyPropertyChanged
    
{
        
private 
string 
name;
        
public 
event 
PropertyChangedEventHandler PropertyChanged;
        
public 
string 
Name
        
{
            
get 
{
return 
name; }
            
set 
{
                
name = value;
                
if 
(
this
.PropertyChanged !=
null
)
                
{
                    
this
.PropertyChanged.Invoke(
this
,
new 
PropertyChangedEventArgs(
"Name"
));
                
}
            
}
        
}
   
}
}

 

现在我们看一下我们点击按钮的结果,此时UI的值已经自动更新为后台更改的对象的值Sun了。

 

3.Binding的方向

<TextBox x:Name="txtName" Text="{Binding Path=Name, Mode=TwoWay}"></TextBox> 

<TextBox x:Name="txtName2" Text="{Binding  Path=Name, Mode=OneWay}"></TextBox>

这个在Binding时可以设置Mode.

oneWay:使用 OneWay 绑定时,每当源发生变化,数据就会从源流向目标。

OneTime: 绑定也会将数据从源发送到目标;但是,仅当启动了应用程序或 DataContext 发生更改时才会如此操作,因此,它不会侦听源中的更改通知。

OneWayToSource: 绑定会将数据从目标发送到源。

TwoWay: 绑定会将源数据发送到目标,但如果目标属性的值发生变化,则会将它们发回给源。

Default: binding的模式根据实际情况来定,如果是可编辑的就是TwoWay,只读的就是OneWay.

上面的例子不设Mode时,默认的就是Default.

 

4.如何用代码设定Binding

<StackPanel x:Name="stackPanel"> 

       <TextBox x:Name="txtName"></TextBox> 

</StackPanel>

 

5. 没有Path的Binding

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958583.html如需转载请自行联系原作者

王德水

你可能感兴趣的文章
腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
查看>>
小程序模板嵌套以及相关遍历数据绑定
查看>>
Systemd入门教程:命令篇(转)
查看>>
java随机范围内的日期
查看>>
linux包之diff
查看>>
spring事务学习(转账案例)(二)
查看>>
[官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
查看>>
http协议与http代理
查看>>
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例...
查看>>
Redis+Spring缓存实例
查看>>
Storm集群安装详解
查看>>
centos7.x搭建svn server
查看>>
原码编译安装openssh6.7p1
查看>>
项目实战:自定义监控项--监控CPU信息
查看>>
easyui-datetimebox设置默认时分秒00:00:00
查看>>
蚂蚁分类信息系统5.8多城市UTF8开源优化版
查看>>
在django1.2+python2.7环境中使用send_mail发送邮件
查看>>
“Metro”,移动设备视觉语言的新新人类
查看>>
PHP源代码下载(本代码供初学者使用)
查看>>
Disruptor-NET和内存栅栏
查看>>