zoukankan      html  css  js  c++  java
  • WPF的Binding学习笔记(一)

    一、binding的一般步骤
    1,准备数据源
        数据源需要实现INotifyPropertyChanged接口
        例如:

    class Person : INotifyPropertyChanged
    {
      public event PropertyChangedEventHandler PropertyChanged;
      private string name;
      public string Name
      {
        get { return name; }
        set
        {
          name = value;
          //触发事件
          if (PropertyChanged != null)
          {
                        PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
          }
        }
      }
    }

    2,准备Binding对象

    Person p = new Person("D-boy");
    Binding binding = new Binding();
    binding.Source = p;
    binding.Path = new PropertyPath("Name");

    3,用Binding对象将数据源和目标连结
    假如在XAML处添加了一个TextBlock目标

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

    那么可以使用BindingOperations.SetBinding()方法将其进行binding了。

    BindingOperations.SetBinding(txtName, TextBlock.TextProperty, binding);

    也可以使用UI元素的基类FramworkElement封装的SetBinding函数

    txtName.SetBinding(TextBlock.TextProperty, binding);

    将上面两步结合在一起可以这样写

    txtName.SetBinding(TextBlock.TextProperty, new Binding("Name") { Source=p});


    二、控件间的Binding
    XAML处如下两个控件

    <TextBox x:Name="txt1" />
    <TextBlock x:Name="txt2" Text="{Binding Path=Text, ElementName=txt1}" />

     如果要改变Binding源的触发事件,可以设置Binding的UpdateSourceTrigger属性为LostFocus、Explicit、PropertyChanged中的一种。

    三、Binding的Path
    1,Path的设置
    如上例,
    XAML处为

    <TextBlock x:Name="txt2" Text="{Binding Path=Text, ElementName=txt1}" />

    或是

    <TextBlock x:Name="txt2" Text="{Binding Text, ElementName=txt1}" />

    相应的C#代码为

    txt2.SetBinding(TextBlock.TextProperty, new Binding(){ Path=new PropertyPath("Value"),Source=txt1});

    或是

    txt2.SetBinding(TextBlock.TextProperty, new Binding("Text") { Source=txt1});

    之类的...
    2,Path还支持一路点下去~~
    比如

    <TextBlock x:Name="txt2" Text="{Binding Text.Length, ElementName=txt1}" />
    <TextBlock x:Name="txt2" Text="{Binding Text.[2], ElementName=txt1}" />

    3,当数据源本身就是数据的时候,Path为.
    window添加命名空间

    xmlns:sys="clr-namespace:System;assembly=mscorlib"

    添加资源

    <Window.Resources>
         <sys:String x:Key="string">
                string!!!!!
         </sys:String>
    </Window.Resources>

    使用Binding

    <TextBlock x:Name="txt2" Text="{Binding ., Source={StaticResource ResourceKey=string}}" />

    精简为

    <TextBlock x:Name="txt2" Text="{Binding Source={StaticResource ResourceKey=string}}" />

    当然这样的情况,我就直接

    <TextBlock x:Name="txt2" Text="{StaticResource ResourceKey=string}" />

    -_- !

  • 相关阅读:
    关于思考力
    2019第24周日
    提高收入的方法
    工作中的管理
    技术是解决问题的一种手段
    Django的事务性
    shell单引号与变量、双引号与变量、如何在多重引号里面取到shell变量的值?
    django外键以及主表和子表的相互查询
    django数据模型中 null=True 和 blank=True 有什么区别?
    Django静态文件的加载以及STATIC_URL、 STATIC_ROOT 、STATICFILES_DIRS的区别
  • 原文地址:https://www.cnblogs.com/pasoraku/p/2732427.html
Copyright © 2011-2022 走看看