• 【Win8】 数据绑定&自定义转换


    数据绑定(接口里面也可以定义事件)
    1、

     (1)简单的绑定和wp7/wp8类似(这里不再写了,很相似的,请参考
            随机生成5位数据的代码: 

    dog.Name=Guid.NewGuid().ToString().Substring(0,5);


      (2)选择模式
             将LictView中的对勾去掉:<ListView SelectionMode="None" ...> 单一:Single 多选:Multiple
      (3)IList<object> objs=lv1.SelectedItems; //对象为选中项的数据上下文
      (4)IsItemClickedEnabled

    //首先设置 IsItemClickEnabled="True" ,启用ItemClick事件,然后监听ItemClick事件,e.ClickedItem为点击那一项的DataContext
    Person p= e.ClickItem as Person;
    MessageDialog mdialog = new MessageDialog(p.Name);
    mdialog.ShowAsync(); //对话框显示的异步操作

      (5)在集合中添加元素(绑定到ListView中)
             需要用到 ObservableCollection<> 泛型,在Using System.Collections.ObjectModl 命名空间下,除了数据绑定以外,一般其他的集合用 List<> 就ok了,

    // private List<string> ls=new List<string>();
    ObservableCollection<string> ls = new ObservableCollection<string>();
      protected override void OnNavigatedTo(NavigationEventArgs e)
      {
         if (e.NavigationMode== NavigationMode.New)
         {
            ls.Add("kefira");
            ls.Add("kk");
            lv.ItemsSource = ls; //数据绑定到ListView中时,显示数据只需要写出该行代码即可,但是也有人在xaml中修改ListView的属性为 ItemSource={Binding},
                                 // 然后写入后台代码 lv.DataContent=ls;效果是一样的,意义也是一样的,多此一举而已嘛
         } 
      }
      private void Button_Click_1(object sender, RoutedEventArgs e)
      {
         ls.Add(DateTime.Now.Millisecond.ToString()); 
      }

    运行结果如图:

           

    2、自定义转换

        ComboBox -- 下拉列表框 PlipView -- 左右选择显示 以及 自定义转换
         转换器的一般命名规则:XX--XX转换器(例如UI到Model,BoolVisibilityConverter)
         示例:判断该国家是否是联合国,是的话显示联合国图片,不是则不显示

         <1>定义一个CountryInfo类

    using System.ComponentModel;
    
    namespace _1自定义转换
    {
      public   class CountryInfo:INotifyPropertyChanged    //别忘了引入命名空间System.ComponentModel
        {
            private void FirePropertyChanged(string propName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propName));
                }
            }
    
            private string _name;
            public string Name
            {
                get { return _name; }
                set { _name = value; FirePropertyChanged("Name"); }
            }
    
            private string _ImagePath;
            public string ImagePath
            {
                get { return _ImagePath; }
                set { _ImagePath = value; FirePropertyChanged("ImagePath"); }
            }
    
            private bool _isUnNum;  //判断是否是联合国成员
            public bool IsUnNum
            {
                get { return _isUnNum; }
                set { _isUnNum = value; FirePropertyChanged("IsUnNum"); }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
        }
    }

         <2>设计MainPage.xaml界面:  (先把照片放到Image文件夹下)

     <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <ComboBox x:Name="combCountry" HorizontalAlignment="Left" Margin="54,81,0,0" VerticalAlignment="Top" Width="387" Height="71">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="{Binding ImagePath}" Height="50" Width="50" />
                            <TextBlock Name="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            <FlipView x:Name="fvCountry" HorizontalAlignment="Left" Margin="354,270,0,0" VerticalAlignment="Top" Width="610" Height="315">
                <FlipView.ItemTemplate>
                    <DataTemplate>
                        <Grid Background="Blue">
                            <Grid.RowDefinitions>
                                <RowDefinition></RowDefinition>
                                <RowDefinition></RowDefinition>
                            </Grid.RowDefinitions>
                            <Image Source="{Binding ImagePath}" Grid.RowSpan="2"></Image>
                            <Image Source="ms-appx:///Image/4.png" Height="70" Width="70" Visibility="{Binding IsUnNum}"/>  //在定义的时候IsNuNum是bool类                                                                                                                           型的,而在这里转换成了枚举类型            
                        </Grid></DataTemplate>
                </FlipView.ItemTemplate>
            </FlipView>
        </Grid>

        <3>代码实现:
             

       protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                if (e.NavigationMode== NavigationMode.New)
                {
                    List<CountryInfo> listCountry = new List<CountryInfo> (); 
                    listCountry.Add(new CountryInfo { Name = "中国" , ImagePath="ms-appx:///Image/1.png" ,IsNuNum = true});
                    listCountry.Add(new CountryInfo { Name = "日本" , ImagePath="ms-appx:///Image/2.png" ,IsNuNum = false});
                    listCountry.Add(new CountryInfo { Name = "美国" , ImagePath="ms-appx:///Image/3.png" ,IsNuNum = true});
                    combCountry.ItemsSource = listCountry;  //Itemsource继承于ItemTemplate
                }           
            }   

             马上运行了下,却发现 “日本” 也被判定成了是联合国的成员(因为联合国的图片4.png也显示了出来),这里,我们就必须要自定义转换了(这才是重点)
         <4>首先需要定义转换器的类BoolVisibilityConverter,转换器要实现IValueConverter接口

    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Data;
    
    namespace _1自定义转换.Common
    {
       public  class BoolVisibilityConverter : IValueConverter    //IvalueConverter的命名空间为Windows.UI.Xaml.Data;
        {
            object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
            {
                //这里的value是Model中的 数据,返回值是转换后UI中的数据
                bool b = (bool)value;
                return b ? Visibility.Visible : Visibility.Collapsed;
            }
    
            //如果数据绑定是TwoWay形式的,那么还需要实现该ConvertBack
            object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language)
            {
                Visibility v = (Visibility)value;   //Visibility的命名空间为 Windows.UI.Xaml;
                return v == Visibility.Visible;
            }
        }
    }

    ########解释下:
    Convert方法用于把绑定模型的属性类型转换为被绑定UI元素的数据类型,value为转换前数据,把转换后数据以返回值形式返回。
    ConvertBack方法用于当TwoWay绑定的时候UI值发生变化方向修改Model属性值的时候做转换的。

        <5>然后再转到MainPage.xaml中设计
              首先添加命名空间: xmlns:common="using:_1自定义转换.Common"     //common是随意的命名
              然后定义资源:

    <Page.Resources>
          <common:BoolVisibilityConverter x:Key="boolVisConverter"></common:BoolVisibilityConverter>
    </Page.Resources>

              最后,在定义的 “联合国图片4.png” 的 Image 标签下的 Visibility 属性中再加上:Converter={StaticResource boolVisConverter}
      ok,自定义的转换完成,运行程序。如下图:(当底下图片转换到 “中国” 或 “美国” 时,联合国的照片显示;但底下图片是 “日本” 时,联合国的图片不显示)

                   


    ---后记:这节是数据绑定和自定义转换的简单练习,依旧来自于传智播客视频的学习,分享给同样爱好win8的朋友们!@_@

     下篇文章将会写到动画和异步编程。

  • 相关阅读:
    各种概念POJO、JAVABEAN、DAO、DTO、PO、VO、BO、SSH、EJB
    SSH框架与SSI框架的区别
    SSH框架结构分析
    SSH框架系列:Spring配置多个数据源
    Java系列之:看似简单的问题 静态方法和实例化方法的区别
    数据库同步和使用JSONObject让Java Bean“原地满状态复活”
    Java工作队列和线程池
    Lucene之删除索引
    Java设计模式之Iterator模式
    有关《查找两个List中的不同元素》的问题解答与编程实践
  • 原文地址:https://www.cnblogs.com/kefira/p/Win8.html
Copyright © 2020-2023  润新知