Silverlight实用窍门系列:65.Silverlight的数据模板DataTemplate(一)使用数据模板

 在Silverlight中,我们的数据列表显示控件有ListBox、DataGrid等。对于显示出来的数据条目样式外观的管理是通过DataTemplate(数据模板)来完成的。本节将从DataTemplate基础说起如何使用DataTemplate。

  首先我们准备数据源如下:

    /// <summary>
    /// 文章Model
    /// </summary>
    public class ArticleModel
    {
        public string ArtName { get; set; }

        public string ArtContent { get; set; }

        public string ArtAuthor { get; set; }

        public string ArtUpdateTime { get; set; }
    }

    /// <summary>
    /// 文章列表
    /// </summary>
    public class ArtList
    {
        public ArtList()
        {
            ArticleList = new List<ArticleModel>();
            ArticleList.Add(new ArticleModel() { ArtName = "成都", ArtContent = "天府之国", 
                ArtAuthor = "leung", ArtUpdateTime = "2012-04-05 11:12:36" });
            ArticleList.Add(new ArticleModel() { ArtName = "上海", ArtContent = "翡翠明珠", 
                ArtAuthor = "aiLen", ArtUpdateTime = "2012-05-16 21:32:10" });
            ArticleList.Add(new ArticleModel() { ArtName = "广州", ArtContent = "沿海城市",
                ArtAuthor = "minghe", ArtUpdateTime = "2012-01-17 05:01:45" });
            ArticleList.Add(new ArticleModel() { ArtName = "西藏", ArtContent = "高原城市", 
                ArtAuthor = "weifeng", ArtUpdateTime = "2012-03-22 09:30:14" });
        }

        /// <summary>
        /// 文章列表属性
        /// </summary>
        public List<ArticleModel> ArticleList { get; set; }
    }

  如何在前台控件中绑定数据源呢?如同上一节所述,设置一个静态资源

    //引用域名空间 

xmlns:local="clr-namespace:SLDataTemplate"   //初始化为静态资源
<UserControl.Resources> <local:ArtList x:Key="SourceList"></local:ArtList> </UserControl.Resources> //设置为数据上下文
<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource SourceList}">     //设置数据源绑定
<ListBox x:Name="lbArt" ItemsSource="{Binding ArticleList}" /> </Grid>

 

  其次以ListBox为例,在本文中有三种方式:

    一、在ListBox.ItemTemplate中直接添加DataTemplate。

        <ListBox  x:Name="lbArt" ItemsSource="{Binding ArticleList}"  Width="350"
                  Height="300" HorizontalAlignment="Left" VerticalAlignment="Top" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding ArtName}"></TextBlock>
                        <TextBox Text="{Binding ArtContent}"></TextBox>
                        <TextBox Text="{Binding ArtAuthor}"></TextBox>
                        <TextBlock Text="{Binding ArtUpdateTime}"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    二、将DataTemplate作为Resources,ListBox中属性 ItemTemplate="{StaticResource lbTmp}"引用。

    <UserControl.Resources>
        <DataTemplate x:Key="lbTmp">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding ArtName}"></TextBlock>
                <TextBox Text="{Binding ArtContent}"></TextBox>
                <TextBox Text="{Binding ArtAuthor}"></TextBox>
                <TextBlock Text="{Binding ArtUpdateTime}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </UserControl.Resources>
        <ListBox x:Name="lbRes" ItemsSource="{Binding ArticleList}" 
                 ItemTemplate="{StaticResource lbTmp}" Margin="370 0 0 0 "
                 HorizontalAlignment="Left" VerticalAlignment="Top"
                 Width="350" Height="300" >
        </ListBox>
    三、将DataTemplate在后台代码编写,然后在后台代码中指定。
     //前台代码

<ListBox x:Name="lbCsRet" Margin="0 370 0 0 " HorizontalAlignment="Left" VerticalAlignment="Top" Width="350" Height="300" > </ListBox>

 

     //后台代码


public MainPage() { InitializeComponent(); DataTemplate dtemp = GetTemplate(); this.lbCsRet.ItemTemplate = dtemp; this.lbCsRet.ItemsSource = new ArtList().ArticleList; } private DataTemplate GetTemplate() { string xamlString = @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""> <StackPanel Orientation=""Horizontal""> <TextBlock Text=""{Binding ArtName}""></TextBlock> <TextBox Text=""{Binding ArtContent}""></TextBox> <TextBox Text=""{Binding ArtAuthor}""></TextBox> <TextBlock Text=""{Binding ArtUpdateTime}""></TextBlock> </StackPanel> </DataTemplate>"; return (DataTemplate)XamlReader.Load(xamlString); }

    最后我们可以看看同样在DataGrid中使用DataTemplate。

        <sdk:DataGrid ItemsSource="{Binding ArticleList}" Margin="370 370 0 0 "
                      HorizontalAlignment="Left" VerticalAlignment="Top" 
                      Width="350" Height="300" AutoGenerateColumns="False" >
            <sdk:DataGrid.Columns>
                <sdk:DataGridTemplateColumn Header="列表" CellTemplate="{StaticResource lbTmp}">
                </sdk:DataGridTemplateColumn>
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>

  下面我们来看看运行效果,如需源码请点击 SLDataTemplate.zip 下载。

  



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/855588

WPF中的DataTemplateSelector是一个非常有用的工具,它允许我们根据数据类型或其他条件来选择使用哪个DataTemplate来呈现数据使用DataTemplateSelector的步骤如下: 1. 创建一个继承自DataTemplateSelector的类: ``` public class MyDataTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { if (item is MyType1) { return (DataTemplate)Application.Current.Resources["MyType1Template"]; } else if (item is MyType2) { return (DataTemplate)Application.Current.Resources["MyType2Template"]; } else { return null; } } } ``` 2. 在XAML中使用DataTemplateSelector: ``` <ItemsControl ItemsSource="{Binding}"> <ItemsControl.ItemTemplateSelector> <local:MyDataTemplateSelector/> </ItemsControl.ItemTemplateSelector> </ItemsControl> ``` 动态绑定可以让我们在运行时动态地改变数据绑定的目标或源。使用动态绑定的步骤如下: 1. 创建一个继承自INotifyPropertyChanged接口的类,该类包含需要动态绑定的属性。 2. 在XAML中使用Binding对象绑定属性: ``` <TextBlock Text="{Binding MyProperty}"/> ``` 3. 在代码中动态更改属性的值: ``` MyObject.MyProperty = "New Value"; ``` DataTemplate.Triggers是一个非常有用的工具,它允许我们根据数据的某些属性来更改DataTemplate的样式。使用DataTemplate.Triggers的步骤如下: 1. 在DataTemplate中添加Trigger对象: ``` <DataTemplate x:Key="MyTemplate"> <Border BorderThickness="1" BorderBrush="Black"> <TextBlock Text="{Binding}"> <TextBlock.Style> <Style TargetType="{x:Type TextBlock}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=Status}" Value="Error"> <Setter Property="Foreground" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </Border> </DataTemplate> ``` 2. 在数据对象中添加属性: ``` public string Status { get; set; } ``` 3. 在代码中更改属性的值: ``` MyObject.Status = "Error"; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值