Silverlight中的TabControl如何绑定数据?

摘要:
作为从ItemsControl派生的类,TabControl ItemsSource似乎需要IEnumerable<TabItem>,这很难接受。我想知道这是不是真的?作为一种无奈的解决方案,您只能通过代码动态添加每个TabItem,并单独绑定它们。

 在 WPF 中,TabControl 可以直接将 ItemsSource 绑定数据源,见

将 TabControl 绑定到数据的示例

http://msdn.microsoft.com/zh-cn/library/aa972130(VS.90).aspx

<Window.Resources>
<ObjectDataProvider x:Key="TabListResource" ObjectType="{x:Type src:TabList}" />
<DataTemplate x:Key="HeaderTemplate">
<TextBlock Text="{Binding Path=Header}" />
</DataTemplate>
<DataTemplate x:Key="ContentTemplate">
<TextBlock Text="{Binding Path=Content}" />
</DataTemplate>
</Window.Resources>
<DockPanel>
<TabControl ItemsSource="{Binding Source={StaticResource TabListResource}}"
ItemTemplate
="{StaticResource HeaderTemplate}"
ContentTemplate
="{StaticResource ContentTemplate}"/>
</DockPanel>

匪疑所思的是,TabControl.ItemTeplate 居然是用于 Header, ContentTemplate 才是用于 TabItem。

但是在 Silverlight 中貌似无此功能, TabControl.ContentTemplate  属性也不存在。

作为从 ItemsControl 中派生的类,Silverlight 中的 TabControl.ItemsSource 貌似要求为 IEnumerable<TabItem>,

这让人很难接受, 不知是不是真的这样?

作为无奈的解决办法,只能对通过代码动态添加各个 TabItem,并对它们分别进行 Binding。

下面是代码:

namespace TabControl_DataBinding
{
using System;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;

public class Model
{
public ObservableCollection<Article> Articles { get; private set; }
public Model()
{
this.Articles = new ObservableCollection<Article>();
}
}
public class Article
{
public string LanguageCode { get; set; }
public string LanguageName { get; set; }
[Display(Name
="主题")]
public string Subject { get; set; }
[Display(Name
= "详细描述")]
public string Description { get; set; }
}

public class Settings
{
public static System.Collections.Generic.Dictionary<string, string>
Languages {
get; private set; }
static Settings()
{
Languages
= new System.Collections.Generic.Dictionary<string, string>();
Languages.Add(
"en", "English");
Languages.Add(
"zh-Hans", "简体");
Languages.Add(
"zh-Hant", "繁体");
}
}
}

<UserControl.Resources>
<DataTemplate x:Key="languageDataTemplate">
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<sdk:Label Grid.Column="0" Grid.Row="0"
Target
="{Binding ElementName=txtSubject}" />
<TextBox Grid.Column="1" Grid.Row="0" Name="txtSubject"
Text
="{Binding Subject, Mode=TwoWay,
ValidatesOnExceptions=true, NotifyOnValidationError=true}
" />
<sdk:Label Grid.Column="0" Grid.Row="1"
Target
="{Binding ElementName=txtDetail}" />
<TextBox Grid.Column="1" Grid.Row="1" Name="txtDetail" Width="280"
Text
="{Binding Description, Mode=TwoWay,
ValidatesOnExceptions=true, NotifyOnValidationError=true}
"
Height
="80" AcceptsReturn="True" TextWrapping="Wrap"
VerticalScrollBarVisibility
="Auto" />
</Grid>
</DataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<sdk:TabControl Name="tabControl1" Margin="16" >
</sdk:TabControl>
</Grid>
public partial class MainPage : UserControl
{
Model data;
public MainPage()
{
InitializeComponent();
this.Loaded += (sender, e) =>
{
this.GenerateData();
this.BindControls();
};
}
/// <summary>
/// 创建初始数据
/// </summary>
void GenerateData()
{
this.data = new Model();
foreach (var item in Settings.Languages)
{
this.data.Articles.Add(new Article()
{
LanguageCode
= item.Key,
LanguageName
= item.Value,
Subject
= "主题" + item.Value
});
}
}

void BindControls()
{
foreach (var item in Settings.Languages)
{
Article article
= this.data.Articles
.Single(art
=> art.LanguageCode == item.Key);
TabItem ti
= new TabItem()
{
Header
= article.LanguageName,
Tag
= article.LanguageCode,
ContentTemplate
= (DataTemplate)this.Resources["languageDataTemplate"]
};
ti.SetBinding(TabItem.ContentProperty,
new System.Windows.Data.Binding());
this.tabControl1.Items.Add(ti);
ti.DataContext
= article;
}
}


}

 

免责声明:文章转载自《Silverlight中的TabControl如何绑定数据?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android获取系统时间方法的总结计算机基础知识:原码、反码、补码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows Phone开发工具初体验【转载】

Windows Phone开发工具在MIX 2010上火热登场了。Windows Mobile开发者们压抑许久的热情终于爆发出来,对于Windows Phone的华丽转身,开发者们褒贬不一,有人对Silverlight、 XNA等新技术充满期待,有人对放弃以前版本兼容性、不支持C++开发满腹怨言。 无论如何,Windows Phone为我们带来了新的用户体...

Windows Phone-框架结构和启动过程

上一篇文章介绍了Windows Phone的开发环境和一个简单的Windows Phone程序的演示和结构,这一篇文章要深入一点,介绍Windows Phone的框架结构和程序启动的过程。 一 Windows Phone 框架结构 在进行Windows Phone开发之前有必要了解一下整个全新平台的结构。对于Windows Phone平台来说,区别于之前的...

WCF RIA Services使用详解

理解领域服务和领域操作 本文目录: 3.1 WCF Ria Services简介 3.1.1 什么是WCF Ria Services 3.1.2 WCF Ria Services如何生成客户端代码 3.1.3 如何使用WCF Ria Services 3.2 实战WCF Ria Services开发 3.2.1 使用Silverlight业务应用程序项目模...

Silverlight中Image控件Source属性

silverlight的Image控件Source属性1.图片文件在sl工程下,且图片生成操作为资源时,该文件被编译入sl.dll动态库中则为Source赋值时应使用/<SL程序名>;component/[子路径/]文件名2.图片文件在sl工程下,且图片生成操作为内容时,该文件被打包入.xap压缩包中则为Source赋值时应使用/[子路径/]文...

反编译Silverlight项目

在文章的开头,我想事先说明,本文并非诱导读者恶意反编译他人作品,盗取他人代码成果,只是为了学习Silverlight讨论而用。 在互联网上,每天都会有很多Silverlight项目发布,有的是开源,有的只是为了展示。在Silverlight学习的初期,多数都需要模仿学习,所以,发现一个Silverlight项目,能够查看其中的源代码是最好不过了。但是,Si...

学习使用Bing Maps Silverlight Control(五):离线使用和自定义地图模式

6 离线使用 在笔记第一部分的时候就提到如果要使用Bing Maps Silverlight Control 进行开发,需要申请一个key,不让会显示一个错误提示出来。但是在实际开发或使用过程中,使用环境和地图数据可能不是在线的,但控件因为验证失败仍然会显示以下内容: 如何去掉这个提示?最简单的方式就是自己扩展一个Map控件,在其构造方法中将错误提示层给...