zoukankan      html  css  js  c++  java
  • WPF绑定Binding及模式

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

    1. 默认绑定

    public class Company 

        public string Name { get; set; } 

    XAML代码

     
    1 <StackPanel x:Name="stackPanel">
    2     <TextBox x:Name="txtName" Text="{Binding Path=Name}"></TextBox>
    3     <TextBox x:Name="txtName2" Text="{Binding  Path=Name}"></TextBox>
    4     <Button Click="Button_Click">Ok</Button>
    5 </StackPanel>

    后端代码:

     
    01 namespace DeepXAML
    02 {
    03     public partial class MainWindow : Window
    04     {
    05         Company mCompany;
    06         public MainWindow()
    07         {
    08             InitializeComponent();
    09             mCompany = new Company { Name = "Microsoft" };
    10             this.stackPanel.DataContext = mCompany;
    11         }
    12         private void Button_Click(object sender, RoutedEventArgs e)
    13         {            
    14             MessageBox.Show(this.mCompany.Name);
    15             mCompany.Name = "Sun";
    16         }        
    17     }
    18 }

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

     image

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

    image

    2. 双向绑定

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

     
    01 namespace DeepXAML
    02 {
    03    public  class Company:INotifyPropertyChanged
    04     {
    05         private string name;
    06         public event PropertyChangedEventHandler PropertyChanged;
    07         public string Name
    08         {
    09             get { return name; }
    10             set {
    11                 name = value;
    12                 if (this.PropertyChanged != null)
    13                 
    14                     this.PropertyChanged.Invoke(this,new PropertyChangedEventArgs("Name"));
    15                 }
    16             }
    17         }
    18    }
    19 }

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

    image

    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.

    image

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

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

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

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

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

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

    4.如何用代码设定Binding

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

    </StackPanel>

    image

    5. 没有Path的Binding

    imageimage

  • 相关阅读:
    ubuntu常用命令
    安装 Ruby, Rails 运行环境 常见的错误
    dubbo user guider笔记之一Preface
    翻译-Your first Dubbo application
    翻译-1.2 容器概述
    翻译-Core Technologies
    翻译-1.1 关于spring ioc容器和bean的介绍
    TCP协议-滑动窗口及拥塞控制
    QUARTZ之三-JobStores相关概念
    项目经验总结
  • 原文地址:https://www.cnblogs.com/zzw1986/p/4688422.html
Copyright © 2011-2022 走看看