zoukankan      html  css  js  c++  java
  • 平稳转型WP系列之在Windows Phone中谈“委托”、“事件”和“接口”(一、深入理解)

    园子里有很多讲“委托”,“事件”和“接口”的文章,好文章有很多。在这片文章里将结合“Windows Phone”的一个开发实例,.net机制和自己的粗陋的理解来介绍。

    首先看实例全部代码:

    后台代码:

     public class NotepadItem:INotifyPropertyChanged
        {
            public string _title;
            public string Title
            {
                get { return _title; }
                set
                {
                    _title = value;
                    NotifyPropertyChanged("Title");
                }
            }

            public string _intro;
            public string Intro
            {
                get { return _intro; }
                set
                {
                    _intro = value;
                    NotifyPropertyChanged("Intro");
                }
            }

            public string _cont;
            public string Cont
            {
                get { return _cont; }
                set
                {
                    _cont = value;
                    NotifyPropertyChanged("Cont");
                }
            }


            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(string propertyName)
            {
                if (null != PropertyChanged)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

    前台XAML代码:

    <controls:Pivot Title="手机保险箱">
                <!--Pivot item one-->
                <controls:PivotItem Header="秘密记事本">
                    <!--Double line list with text wrapping-->
                    <ListBox x:Name="FirstListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="FirstListBox_SelectionChanged" >
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                              <StackPanel Margin="0,0,0,17" Width="432">
                                    <TextBlock Text="{Binding Title}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                    <TextBlock Text="{Binding Intro}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                              </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </controls:PivotItem>


    开始分析,Let go...

    这段代码实现的功能:将信息绑定到Listbox控件,当数据源信息发生改变时,页面上展示的信息也跟着改变。(功能简单吧,主要介绍“委托”、“事件”和“接口”)

    一、“INotifyPropertyChanged”接口(Interface)

         // Summary:
        //     Notifies clients that a property value has changed.
        public interface INotifyPropertyChanged
        {
            // Summary:
            //     Occurs when a property value changes.
            event PropertyChangedEventHandler PropertyChanged;
        }

         “接口”就是一套标准,然后由“实现类”实现其中具体的方法,可以理解为一组抽象类。任何类只要实现了这个接口,也就是实现了“PropertyChanged”方法,就可以“做一些事情”。“这些事情”就是指类属性的改变触发些事件。

          注意:这里的“任何类”都去继承它,它们都有相同的功能要实现,这样大家都保持了一致。而不是每个人都声明自己的,这样就保证了规范化,要变大家一起变,“接口”的优势,你也可以理解为“模块对接标准”。

    二、委托(delegate)

          在接口中已经看到"PropertyChangedEventHandler",对它就是一个委托,看看它的定义。

          public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);

          当你在一个方法中要调用另一个方法,而它们又不在一个“类”下,甚至不在同一个命名空间下。又或者说你要在一个方法中调用一批方法,这批方法的方法体相似,只有一些属性变量不同。这是笨方法就是使用条件或是枚举进行判断,这样如果又有新的方法加入了怎么办,从新修改判断语句???这就牵扯到项目的可扩展了。这是怎么办比较好呢?把这些方法作为参数直接传入目标方法中,也就是大家说的“将方法作为方法的参数”。

          既然方法成了参数,那么参数应该有“参数类型”吧,用于规定方法代表的参数的种类。就像“String” 类型的参数。  这种“方法”类型参数的定义者就是“委托”。委托其实是一个类,虽然定义方法像定义方法似地,所以才可以定义类型吗。编译的时候就变为类了,也正是因为它是一个类,所以才可以在所有声明类的地方声明委托,也就是可以在命名空间里直接声明委托。

          这样就可以直接将方法作为参数传入另一个方法里面了,在方法里面只要调用“参数”,就可以调用传入的“方法”。不用在纠结于执行方法的判断了,传什么咱就执行什么。

         既然“委托”是类型,那么你自然就可以使用它定义变量了。

         比如:这时有两个类,一个“Manager”,一个“Employ”,要在“Manager”中调用“Employ”中的方法怎么办?这时可以声明一个委托“ManagerDelegate”,然后使用这个委托定义一个变量“delegate”,然后把“Employ”中的方法赋值给“deleegate”,再把“delegate”传入“Manager”方法即可。是不是和使用类型的变量方式一样,只不过在委托中一个变量不只可以赋值“一个方法”,还可以“绑定”更多的方法。第一个要赋值“=”,以后绑定“+=”,去除“-=”。

          试想,如果我们将“delegate”,变量放入"Manager"类中会怎么样?

          加上判断if(delegate!=null){ delegate() //调用委托方法}else{},直接执行“委托定义的变量:delegate”了,那么这个“deltegate”还有个名字你知道就什么吗?  猜对了,就是“事件”。

    三:事件(Event)

          在变量“delegate”,变身“事件”之前,还要增加一个“Event”关键子,以增强封装性。

          一句话,事件是一个进行了封装的委托类型的变量。

          这也就是“event PropertyChangedEventHandler PropertyChanged;”中“event”的来历。

    总之:接口是“模块对接”标准,要变大家一起变。委托是把“方法”作为参数,对应的参数类型。事件是委托类型定义的再经过“event”封装的变量。

    这只是在下鄙陋的理解和看法,肯定有很多不当的地方,还请大家多多指教。

    还没有介绍整体的实现流程和.net实现机制,关于这些内容将会在下面作介绍,敬请关注。

    扩展资源


          

           

  • 相关阅读:
    Dot Net WinForm 控件开发 (七) 为属性提下拉式属性编辑器
    WinForm 程序的界面多语言切换
    c#遍历HashTable
    Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
    Dot Net WinForm 控件开发 (六) 为属性提供弹出式编辑对话框
    Dot Net WinForm 控件开发 (一) 写一个最简单的控件
    Dot Net WinForm 控件开发 (四) 设置属性的默认值
    Dot Net WinForm 控件开发 (二) 给控件来点描述信息
    Dot Net WinForm 控件开发 (八) 调试控件的设计时行为
    Dot Net WinForm 控件开发 (五) 复杂属性的子属性
  • 原文地址:https://www.cnblogs.com/ssol/p/2139660.html
Copyright © 2011-2022 走看看