Silverlight中的TabControl如何绑定数据?

 

 在 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)