MSND 教程短片 WPF 18(绑定)

WPF之绑定

绑定在WPF中是一个重点,也是难点。下面我们通过例子来简单讲讲绑定。

我们先画一个椭圆,用椭圆的宽来绑定Slider控件的Value。

  1: <Ellipse Margin="68,51,88,0" Name="ellipse1" Stroke="Black"
  2: Height="53" VerticalAlignment="Top" Fill="Blue"  
  3: Width="{Binding ElementName=slider1,Path=Value}"/>
  4: <Slider Height="40" Margin="39,0,51,59" Name="slider1"
  5:  VerticalAlignment="Bottom" Maximum="100" />

通常,每个绑定都具有四个组件:绑定目标对象、目标属性、绑定源,以及要使用的绑定源中的值的路径。这里绑定目标是ellipse1,目标属性是Width,绑定源是slider1,源属性是Value。

运行看效果:

image image

image

还有双向、单项绑定等。看下图。有图有真相。

image

  • OneWay 绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。此绑定类型适用于绑定的控件为隐式只读控件的情况。例如,您可能绑定到如股票行情自动收录器这样的源,或许目标属性没有用于进行更改的控件接口(如表的数据绑定背景色)。如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。

  • TwoWay 绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。大多数属性都默认为 OneWay 绑定,但是一些依赖项属性(通常为用户可编辑的控件的属性,如 TextBox 的 Text 属性和 CheckBox 的 IsChecked 属性)默认为 TwoWay 绑定。确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。

  • OneWayToSource 与 OneWay 绑定相反;它在目标属性更改时更新源属性。一个示例方案是您只需要从 UI 重新计算源值的情况。

  • OneTime 绑定未在图中显示,该绑定会导致源属性初始化目标属性,但不传播后续更改。这意味着,如果数据上下文发生了更改,或者数据上下文中的对象发生了更改,则更改会反映在目标属性中。如果您使用的数据的当前状态的快照适于使用,或者这些数据是真正静态的,则适合使用此绑定类型。如果要使用源属性中的某个值初始化目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。此绑定类型实质上是 OneWay 绑定的简化形式,在源值不更改的情况下可以提供更好的性能。

    请注意,若要检测源更改(适用于 OneWay 和 TwoWay 绑定),则源必须实现一种合适的属性更改通知机制(如 INotifyPropertyChanged)。有关 INotifyPropertyChanged 实现的示例,请参见如何:实现属性更改通知

    UpdateSourceTrigger的运用

    下面我们来看一下绑定中的依赖属性。

    首先我们,新建一个Person.cs类

      1: class Person:INotifyPropertyChanged
    
      2:     {
    
      3:         public event PropertyChangedEventHandler PropertyChanged;
    
      4: 
    
      5:         private string _name;
    
      6: 
    
      7:         public Person(string s)
    
      8:         {
    
      9:             _name = s;
    
     10:         }
    
     11: 
    
     12:         public string Name
    
     13:         {
    
     14:             get { return _name; }
    
     15:             set { _name = value;OnPropertyChanged("Name"); }
    
     16:         }
    
     17:         void OnPropertyChanged(string  property)
    
     18:         {
    
     19:             if (PropertyChanged!=null)
    
     20:             {
    
     21:                 PropertyChanged(this,new PropertyChangedEventArgs(property));
    
     22:                 
    
     23:             }
    
     24:         }
    
     25:     }

    xaml是:

  •   1: <Grid>
    
      2:         <Grid.Resources>
    
      3:             <ObjectDataProvider x:Key="odp"
    
      4:                                 ObjectType="{x:Type src:Person}">
    
      5:                 <ObjectDataProvider.ConstructorParameters>
    
      6:                     <system:String>Hello WPF</system:String>
    
      7:                 </ObjectDataProvider.ConstructorParameters>
    
      8:             </ObjectDataProvider>
    
      9:         </Grid.Resources>
    
     10:        <TextBox Height="50" Text="{Binding Source={StaticResource odp}, Path=Name}"
    
     11:                  HorizontalAlignment="Left" FontSize="36"
    
     12:                  Margin="70,42,0,0"
    
     13:                  Name="textBox1"
    
     14:                  VerticalAlignment="Top"
    
     15:                  Width="226" />
    
     16:        <TextBox Height="50" Text="{Binding Source={StaticResource odp},
    
     17:                  Path=Name, UpdateSourceTrigger=PropertyChanged}"
    
     18:                  HorizontalAlignment="Left" FontSize="36"
    
     19:                  Margin="70,96,0,0"
    
     20:                  Name="textBox2"
    
     21:                  VerticalAlignment="Top"
    
     22:                  Width="226" />
    
     23: </Grid>
  • 这里有两个TextBox,第一个是改变了文本中的值,不会影响到数据,第二个就会了,因为Person实现了INotifyPropertyChanged接口。第二个TextBox的UpdateSourceTrigger为PropertyChanged。既当绑定目标属性更改时,立即更新绑定源。
  • 还有其他三个:

    Default
    绑定目标属性的默认 UpdateSourceTrigger 值。多数依赖项属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。

    LostFocus
    当绑定目标元素失去焦点时,更新绑定源。

    Explicit
    仅在调用 UpdateSource 方法时更新绑定源。

  • 原文地址:https://www.cnblogs.com/dingli/p/1942824.html