zoukankan      html  css  js  c++  java
  • 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);
    
  • 相关阅读:
    HDU3107 Godfather(树的重心)
    POJ1655 Balancing Act(树的重心)
    codeforces 691F Couple Cover(暴力预处理)
    codeforces 691E Xor-sequences(矩阵快速幂)
    codeforces 691D Swaps in Permutation(并查集)
    HDU5727 Necklace(环排+匈牙利)
    codeforces679C Bear and Square Grid(dfs优化)
    codeforces679B Bear and Tower of Cubes(思路)
    spring boot
    spring boot资料收集
  • 原文地址:https://www.cnblogs.com/Jax/p/693359.html
Copyright © 2011-2022 走看看