我想在Silverlight中构建一个TabControl,它由一组对象驱动。我将在下面展示我正在尝试原型的非常基本设置的代码。
MainPage.xaml中
<UserControl x:Class="DataDrivenTabControl.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
xmlns:local="clr-namespace:DataDrivenTabControl"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.DataContext>
<local:MainPage_ViewModel/>
</UserControl.DataContext>
<StackPanel>
<controls:TabControl>
<!-- What do I need to do here for a Template? -->
</controls:TabControl>
</StackPanel>
MainPage_ViewModel.cs
public class MainPage_ViewModel : Base_ViewModel
{
public MainPage_ViewModel()
{
PopulateCollectionOfTabs();
}
public ObservableCollection<TabItem_DataViewModel> CollectionOfTabs
{
get { return collectionOfTabs; }
set
{
if (collectionOfTabs != value)
{
collectionOfTabs = value;
OnPropertyChanged("CollectionOfTabs");
}
}
}
private ObservableCollection<TabItem_DataViewModel> collectionOfTabs = new ObservableCollection<TabItem_DataViewModel>();
private void PopulateCollectionOfTabs()
{
this.CollectionOfTabs.Add(
new TabItem_DataViewModel()
{
TabDescription = "Tab 1",
ButtonDescription = "Button for Tab 1"
});
this.CollectionOfTabs.Add(
new TabItem_DataViewModel()
{
TabDescription = "Tab 2",
ButtonDescription = "Button for Tab 2"
});
}
}
TabItem_DataViewModel.cs
public class TabItem_DataViewModel : Base_ViewModel
{
public string TabDescription
{
get { return tabDescription; }
set
{
if (tabDescription != value)
{
tabDescription = value;
OnPropertyChanged("TabDescription");
}
}
}
private string tabDescription = string.Empty;
public string ButtonDescription
{
get { return buttonDescription; }
set
{
if (buttonDescription != value)
{
buttonDescription = value;
OnPropertyChanged("ButtonDescription");
}
}
}
private string buttonDescription = string.Empty;
}
我在这个例子中真正想做的就是让TabControl显示一个动态的选项卡列表,这些选项卡将绑定到一个集合(标题中的“选项卡1”和“选项卡2”)目前的实施)。当您单击选项卡时,可能会有一个按钮(为简单起见),其中按钮的内容将绑定到TabItem_DataViewModel上的ButtonDescription。这是非常基本的,但是如果我可以使用它,我肯定能够实现我的其余解决方案。
我确定必须使用TabControl上的模板完成,但我只是把它留空了,希望有人能够指出我正确的方向。
非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
我可以通过使用Telerik的RadTabControl按预期工作,如下所示。我使用Telerik的版本,因为ItemSource是一个IEnumerable,而不是TabItems的集合。
<telerikNavigation:RadTabControl ItemsSource="{Binding CollectionOfTabs}">
<telerikNavigation:RadTabControl.ItemContainerStyle>
<Style TargetType="telerikNavigation:RadTabItem">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding TabDescription}"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Button Content="{Binding ButtonDescription}" Width="100" HorizontalAlignment="Center"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</telerikNavigation:RadTabControl.ItemContainerStyle>
</telerikNavigation:RadTabControl>