您的位置:首页 > 其它

Silverlight中的TabControl如何绑定数据?

2010-08-09 21:15 423 查看
在 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;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐