• 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;
    }
    }


    }

     

  • 相关阅读:
    养成好习惯:在控制面板里停止服务
    很吊炸天的Xcode插件,你想要的这都有
    Cscope how to support java and c++
    java_lambda表达式
    【C语言】14-返回指针的函数与指向函数的指针
    李洪强
    【C语言】13-指针和字符串
    李洪强-C语言7-C语言运算符
    【C语言】12-指向一维数组元素的指针
    李洪强-C语言6-控制结构
  • 原文地址:https://www.cnblogs.com/Sunpire/p/1796059.html
Copyright © 2020-2023  润新知