• WPF笔记(4.1 旧有事件绑定)——Data Binding


    这一节是对.NET2.0事件绑定技术的总结。
        .NET事件绑定是基于Observer模式的,关于这部分见我的《CLR笔记10.事件》。在.NET2.0中,对Observer进行了一次包装,可以引用System.Component命名空间,实现INotifyPropertyChanged接口,可以获得事件PropertyChanged,以及PropertyChangedEventArgs。于是在这套体系下,事件机制事先搭建好了。
    namespace System.ComponentModel
    {
        
    public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);

        
    public interface INotifyPropertyChanged
        
    {
            
    event PropertyChangedEventHandler PropertyChanged;
        }


        
    public class PropertyChangedEventArgs : EventArgs
        
    {
            
    public PropertyChangedEventArgs(string propertyName);

            
    public virtual string PropertyName get; }
        }

    }

    下面看一个例子,这个例子将贯穿本章。

    XAML部分:

    <Window >
      
    <Grid>
        
        
    <TextBlock >Name:</TextBlock>
        
    <TextBox x:Name="nameTextBox"  />
        
    <TextBlock >Age:</TextBlock>
        
    <TextBox x:Name="ageTextBox"  />
        
    <Button x:Name="birthdayButton" >Birthday</Button>
      
    </Grid>
    </Window>

    后台代码部分:
        public partial class Window1 : System.Windows.Window
        
    {
            Person person 
    = new Person("Tom"9);

            
    public Window1()
            
    {
                InitializeComponent();

                
    this.nameTextBox.Text = person.Name;
                
    this.ageTextBox.Text = person.Age.ToString();

                
    // Watch for changes in the controls
                this.nameTextBox.TextChanged += nameTextBox_TextChanged;
                
    this.ageTextBox.TextChanged += ageTextBox_TextChanged;

                person.PropertyChanged 
    += person_PropertyChanged;

                
    this.birthdayButton.Click += birthdayButton_Click;
            }


            
    void person_PropertyChanged(object sender, PropertyChangedEventArgs e)
            
    {
                
    switch (e.PropertyName)
                
    {
                    
    case "Name":
                        
    this.nameTextBox.Text = person.Name;
                        
    break;

                    
    case "Age":
                        
    this.ageTextBox.Text = person.Age.ToString();
                        
    break;
                }

            }


            
    void nameTextBox_TextChanged(object sender, TextChangedEventArgs e)
            
    {
                person.Name 
    = nameTextBox.Text;
            }


            
    void ageTextBox_TextChanged(object sender, TextChangedEventArgs e)
            
    {
                
    int age = 0;
                
    if (int.TryParse(ageTextBox.Text, out age))
                
    {
                    person.Age 
    = age;
                }

            }


            
    private void birthdayButton_Click(Object sender, RoutedEventArgs e)
            
    {
                
    ++person.Age;

                MessageBox.Show(
                  
    string.Format(
                    
    "Happy Birthday, {0}, age {1}!",
                    person.Name,
                    person.Age),
                  
    "Birthday");
            }

        }

    辅助类:

        public class Person : INotifyPropertyChanged
        
    {
            
    public Person() { }
            
    public Person(string name, int age)
            
    {
                
    this.name = name;
                
    this.age = age;
            }


            
    string name;
            
    public string Name
            
    {
                
    get return this.name; }
                
    set
                
    {
                    
    this.name = value;
                    OnPropertyChanged(
    "Name");
                }

            }


            
    int age;
            
    public int Age
            
    {
                
    get return this.age; }
                
    set
                
    {
                    
    this.age = value;
                    OnPropertyChanged(
    "Age");
                }

            }



            
    INotifyPropertyChanged Members

            
    protected void OnPropertyChanged(string propName)
            
    {
                
    if (this.PropertyChanged != null)
                
    {
                    PropertyChanged(
    thisnew PropertyChangedEventArgs(propName));
                }

            }


        }

    显示效果:


     

  • 相关阅读:
    Delphi 拖动
    Unknown picture file extension
    鼠标指针形状
    C_FD_PhysRDBMSKinds
    delphichromiumembedded
    delphi使用 DockForm DesignEditors F2613 Unit 'DockForm' not found
    TBitConverter
    sql 存储过程返回值 变量名
    XE7 数据库独立运行需要的文件
    C++Builder 内存泄露检测
  • 原文地址:https://www.cnblogs.com/Jax/p/884520.html
Copyright © 2020-2023  润新知