• ItemsControl的两种数据绑定方式


         最近在学习ItemsControl这个控件的时候,查看了MSDN上面的一个例子,并且自己做了一些修改,这里主要使用了两种方式来进行相应的数据绑定,一种是使用DataContext,另外一种是直接将一个类绑定到前台,其实这两种方式原理差不多都是将数据模型的对象添加到一个ObservableCollection集合中,然后再绑定到前台,下面分别介绍两种绑定方式:

        第一种是将数据存储在一个ObservableCollection集合中,然后作为ItemsControl的DataContext对象,下面分别贴出相关的代码: 

    <Window x:Class="TestGrid.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:TestGrid"
            Title="MainWindow" Height="350" Width="525">    
        <Grid>
            <ItemsControl Margin="10" x:Name="myItemsControl"  ItemsSource="{Binding}">          
                <ItemsControl.Template>
                    <ControlTemplate TargetType="ItemsControl">
                        <Border BorderBrush="Aqua" BorderThickness="1" CornerRadius="15">
                            <ItemsPresenter/>
                        </Border>
                    </ControlTemplate>
                </ItemsControl.Template>         
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>         
                <ItemsControl.ItemTemplate>
                    <DataTemplate DataType="{ x:Type local:DataSource}">
                        <DataTemplate.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="FontSize" Value="18"/>
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                            </Style>
                        </DataTemplate.Resources>
                        <Grid>                        
                            <Rectangle Fill="Green"/>                       
                            <Ellipse Fill="Red"/>
                            <StackPanel>
                                <TextBlock Margin="3,3,3,0" Text="{Binding Path=Priority,Mode=TwoWay}"/>
                                <TextBlock Margin="3,0,3,7" Text="{Binding Path=TaskName,Mode=TwoWay}"/>
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>       
                <ItemsControl.ItemContainerStyle>
                    <Style>
                        <Setter Property="Control.Width" Value="100"/>
                        <Setter Property="Control.Margin" Value="5"/>
                        <Style.Triggers>
                            <Trigger Property="Control.IsMouseOver" Value="True">
                                <Setter Property="Control.ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content.Description}"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </ItemsControl.ItemContainerStyle>
            </ItemsControl>
        </Grid>   
    </Window>

        这里需要注意的地方是 ItemsSource="{Binding}"这句必须添加,否则后台的数据是无法添加到前台的,这个需要注意,这里贴出后台的代码  

    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace TestGrid
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            private ObservableCollection<DataSource> item = null;
            public MainWindow()
            {
                InitializeComponent();
                item = new ObservableCollection<DataSource>();
                item.Add(
                    new DataSource()
                    {
                        Priority = "1",
                        TaskName = "hello"
                    }
                    );
                item.Add(
                     new DataSource()
                    {
                        Priority = "2",
                        TaskName = "whats"
                    }
                    );
                item.Add(
                    new DataSource()
                    {
                        Priority = "3",
                        TaskName = "your"
                    }
                   );
                item.Add(
                    new DataSource()
                    {
                        Priority = "4",
                        TaskName = "name"
                    }
                   );
                item.Add(
                    new DataSource()
                    {
                        Priority = "5",
                        TaskName = "can"
                    }
                   );
                item.Add(
                    new DataSource()
                    {
                        Priority = "6",
                        TaskName = "you"
                    }
                   );
                this.myItemsControl.DataContext = item;
    
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace TestGrid
    {
       public class DataSource :  INotifyPropertyChanged
        {
           public event PropertyChangedEventHandler PropertyChanged;
           public  DataSource()
           {
           }
    
           private string priority;
           public string Priority
           {
               get
               { 
                   return priority; 
               }
               set 
               { 
                   priority = value;
                   OnPropertyChanged("Priority");
               }
           }
    
    
           private string taskname;
           public string TaskName
           {
               get
               {
                   return taskname;
               }
               set
               {
                   taskname = value;
                   OnPropertyChanged("TaskName");
               }
           }
    
           protected void OnPropertyChanged(string propName)
           {
               if (PropertyChanged != null)
               {
                   PropertyChanged(this, new PropertyChangedEventArgs(propName));           
               }
           
           }
    
           private List<DataSource> datasources;
    
           public List<DataSource> DataSources
           {
               get { return datasources; }
               set { datasources = value; }
           }
            
        }
    }

      这里最重要的一句就是 this.myItemsControl.DataContext = item;这个是将刚才的集合绑定到ItemsControl控件上,这里需要我们的注意。

      另外一种方式的数据绑定就是将一个类绑定到这个ItemsControl控件上,具体的方式如下:  

    <Window x:Class="TestGrid.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:TestGrid"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:MyData x:Key="myDataSource"/>
        </Window.Resources>
        <Grid>
            <ItemsControl Margin="10" x:Name="myItemsControl"  ItemsSource="{Binding Source={StaticResource myDataSource}}">          
                <ItemsControl.Template>
                    <ControlTemplate TargetType="ItemsControl">
                        <Border BorderBrush="Aqua" BorderThickness="1" CornerRadius="15">
                            <ItemsPresenter/>
                        </Border>
                    </ControlTemplate>
                </ItemsControl.Template>         
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>         
                <ItemsControl.ItemTemplate>
                    <DataTemplate DataType="{ x:Type local:DataSource}">
                        <DataTemplate.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="FontSize" Value="18"/>
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                            </Style>
                        </DataTemplate.Resources>
                        <Grid>                        
                            <Rectangle Fill="Green"/>                       
                            <Ellipse Fill="Red"/>
                            <StackPanel>
                                <TextBlock Margin="3,3,3,0" Text="{Binding Path=Priority,Mode=TwoWay}"/>
                                <TextBlock Margin="3,0,3,7" Text="{Binding Path=TaskName,Mode=TwoWay}"/>
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>       
                <ItemsControl.ItemContainerStyle>
                    <Style>
                        <Setter Property="Control.Width" Value="100"/>
                        <Setter Property="Control.Margin" Value="5"/>
                        <Style.Triggers>
                            <Trigger Property="Control.IsMouseOver" Value="True">
                                <Setter Property="Control.ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content.Description}"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </ItemsControl.ItemContainerStyle>
            </ItemsControl>
        </Grid>   
    </Window>

       这里我们通过资源来引用一个类,让后使用  ItemsSource="{Binding Source={StaticResource myDataSource}}"将这个类绑定到ItemsSource控件上面,这里贴出相关的代码,我们定义了一个MyData的类,将该类作为数据源绑定到前台上,这个类的代码如下

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace TestGrid
    {
       public class MyData:ObservableCollection<DataSource>
        {
           public MyData()
           { 
               Add (new DataSource()
                    {
                        Priority = "1",
                        TaskName = "My"
                    }
                    );
               Add(new DataSource()
                   {
                       Priority = "2",
                       TaskName = "Name"
                   }
                    );
               Add(new DataSource()
                   {
                       Priority = "3",
                       TaskName = "Is"
                   }
                    );
               Add(new DataSource()
                   {
                       Priority = "4",
                       TaskName = "Ye"
                   }
                    );
               Add(new DataSource()
                   {
                       Priority = "5",
                       TaskName = "Bo"
                   }
                    );
           
           }
           
        }
    }

      这里面很重要的一部就是让这个类继承自 ObservableCollection<DataSource>,然后来添加相应的数据源,我们在使用继承的时候需要注意这些技巧。

      其实这两种情况都是将一个数据集合绑定到前台,只不过是一些绑定的方式有所不同,实际的原理都是一样的!

  • 相关阅读:
    Java从零开始学二十一(集合List接口)
    Java从零开始学二十(集合简介)
    初识软件工程一
    JAVA中AES对称加密和解密
    java中的数据加密
    Redis哨兵
    Nginx
    Zuul介绍
    ELK快速搭建日志平台
    Kibana安全特性之权限控制
  • 原文地址:https://www.cnblogs.com/seekdream/p/4733398.html
Copyright © 2020-2023  润新知