WPF笔记(1.6 数据绑定)——Hello,WPF!

这个一节都是在讲一个数据绑定的示例。

功用:输入姓和名,点击Add按钮,ListBox增加一条记录,永远是字符串“name: nick”;ListBox原先有3条不同记录,选中ListBox一条记录,两个输入框姓和名相应变化。
技术分析:2个类,一个xaml,一个一个分析。
1)Nickname类, 实体类,提供两个属性Nick和Name,还有一个PropertyChanged事件。实现了INotifyPropertyChanged 接口(从而可以使用PropertyChangedEventArgs事件,在给属性赋值时,激发该事件,通知外界customer——观察者xaml界面相应变化,即数据同步。
2)Nicknames类,实现ObservableCollection<Nickname>接口,类下不再提供自定义的东西,因为实现该接口后,这个类成为了一个Nickname的强类型集合,并且可以将数据的add和remove通知customer,从而数据同步。
注意,INotifyPropertyChanged 适用于单个的类属性,ObservableCollection适用于监视某一堆的数据是否发生变化(add/remove),这是二者的区别。

3)window1.xaml.cs 后台类
提供内部集合names,Nicknames类型。
在构造函数中,先初始化以及绑定button_Click事件,然后实例化names变量,最后绑定names到前台的DockPanel控件:
dockPanel.DataContext = this.names;
DataContext属性设置是关键,感觉和过去的绑定差不多。
Button每按一次,都会在names中加一条同样的数据nick: name

4)window1.xaml 前台

   < DockPanel x:Name = " dockPanel " >
    
< StackPanel DockPanel.Dock = " Top "  Orientation = " Horizontal " >
      
< TextBlock VerticalAlignment = " Center " > Name:  </ TextBlock >
      
< TextBox Text = " {Binding Path=Name} "   />
      
< TextBlock VerticalAlignment = " Center " > Nick:  </ TextBlock >
      
< TextBox Text = " {Binding Path=Nick} "   />
    
</ StackPanel >
    
< Button DockPanel.Dock = " Bottom "  x:Name = " addButton " > Add </ Button >
    
< ListBox
      ItemsSource
= " {Binding} "
      IsSynchronizedWithCurrentItem
= " True "   />
  
</ DockPanel >

  可以看到前台具体数据段是怎么绑定的:
<TextBox Text="{Binding Path=Name}" />
<ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" />
IsSynchronizedWithCurrentItem="True"确保了DockPanel中的TextBox 与ListBox 数据是同步的。但是这样子ListBox中的数据得到的都是同样的字符串
namespace.Nickname——同过去的数据绑定机制,缺少模板,要改写成这样:

<ListBox  ItemsSource="{Binding}"  IsSynchronizedWithCurrentItem="True">
  <ListBox.ItemTemplate>
    <DataTemplate>

      <TextBlock>
        <TextBlock TextContent="{Binding Path=Name}" />:
        <TextBlock TextContent="{Binding Path=Nick}" />
      </TextBlock>
    </DataTemplate>
  </ListBox.ItemTemplate>

</ListBox>

 这一节没有讲ListBox中3行初始数据是从哪里以及如何加载的——将在1.8节详细讨论。

补充:

因为<TextBox Text="{Binding Path=Name}" /> 可以改写为
TextBox.Text>

<Binding Path="Name" />

</TextBox.Text>
从而等价于下列后台代码:
 
   
Binding binding = new Binding(  );

binding.Path = "Name";

textbox1.Text = binding.ProvideValue(textbox1, TextBox.TextProperty);

你可能感兴趣的:(数据绑定)