TabControl
in namespace DotVVM.BusinessPack.Controls
Renders a collection of tabs with specific contents.
Usage & Scenarios
Renders a container with tabs that are defined in the markup, or generated from a collection in the viewmodel.
Sample 1: Basic Usage
The tabs can be defined inside the <bp:TabControl>
individually. Each tab can have a different content in this case.
Alternatively, the tabs can be generated using the DataSource
property bound to a collection in the viewmodel. In this case, the TabHeaderTemplate
and TabContentTemplate
properties are used to specify the header and content of the tabs.
If the tab header contains only a text value, you can use the HeaderText
property instead of the HeaderTemplate
.
<%-- Hardcoded tabs --%>
<bp:TabControl>
<bp:TabItem HeaderText="Tab 1">
<ContentTemplate>
<p>Tab 1 description</p>
</ContentTemplate>
</bp:TabItem>
<bp:TabItem>
<HeaderTemplate>
<i>Tab 2</i>
</HeaderTemplate>
<ContentTemplate>
<p>Tab 2 description</p>
</ContentTemplate>
</bp:TabItem>
</bp:TabControl>
<%-- Templated tabs --%>
<bp:TabControl DataSource="{value: Countries}"
TabIsActiveBinding="{value: IsSelected}"
TabKeyBinding="{value: Id}">
<TabHeaderTemplate>
{{value: Name}}
</TabHeaderTemplate>
<TabContentTemplate>
<ul>
<dot:Repeater DataSource="{value: Cities}">
<ItemTemplate>
<li>{{value: _this}}</li>
</ItemTemplate>
</dot:Repeater>
</ul>
</TabContentTemplate>
</bp:TabControl>
using System.Collections.Generic;
using DotVVM.Framework.ViewModel;
namespace DotvvmWeb.Views.Docs.Controls.businesspack.TabControl.sample1
{
public class ViewModel : DotvvmViewModelBase
{
public List<Country> Countries { get; set; } = new List<Country> {
new Country { Id = 1, Name = "Czech Republic", Cities = new List<string> { "Praha", "Brno" } },
new Country { Id = 2, Name = "Slovakia", Cities = new List<string> { "Bratislava", "Košice" } },
new Country { Id = 3, Name = "United States", Cities = new List<string> { "Washington", "New York" } }
};
}
}
using System.Collections.Generic;
namespace DotvvmWeb.Views.Docs.Controls.businesspack.TabControl.sample1
{
public class Country
{
public int Id { get; set; }
public string Name { get; set; }
public List<string> Cities { get; set; } = new List<string>();
public bool IsSelected { get; set; }
}
}
Sample 2: Tab Key
The ActiveTabKey
property specifies a key of the tab which is currently selected. The key of a tab is automatically generated by default. But you can override it by setting the Key
property. The data-binding works in both ways, so it is possible to switch the tabs by changing the viewmodel property bound to ActiveTabKey
.
The ActiveTabChanged
event specifies a command in the viewmodel which is triggered when the user switches the tab.
<bp:TabControl ActiveTabKey="{value: ActiveTabKey}"
ActiveTabChanged="{command: TabChanged()}">
<bp:TabItem HeaderText="Tab 1">
<ContentTemplate>
<p>Tab 1 description</p>
<bp:Button Text="Go to Tab 2"
Click="{command: ActiveTabKey = "Other"}" />
</ContentTemplate>
</bp:TabItem>
<bp:TabItem Key="Other" HeaderText="Tab 2">
<ContentTemplate>
<p>Tab 2 description</p>
<bp:Button Text="Go to Tab 1"
Click="{command: ActiveTabKey = "Tab 1"}" />
</ContentTemplate>
</bp:TabItem>
</bp:TabControl>
<p>Active tab has changed {{value: ChangeCount}} times.</p>
using DotVVM.Framework.ViewModel;
namespace DotvvmWeb.Views.Docs.Controls.businesspack.TabControl.sample2
{
public class ViewModel : DotvvmViewModelBase
{
public int ChangeCount { get; set; }
public string ActiveTabKey { get; set; } = "Other";
public void TabChanged()
{
ChangeCount++;
}
}
}
Sample 3: Alternative Tab Switching
If you don't want to use the ActiveTabKey
property to identify the tab which is selected, there is an alternative way.
In the data-bound tabs mode, you can use the TabIsActiveBinding
property. This property is bound to a bool
property in each of the DataSource
collection items, and it will keep track of whether the tab is selected or not.
<bp:TabControl DataSource="{value: Countries}"
TabIsActiveBinding="{value: IsSelected}"
TabHeaderTextBinding="{value: Name}"
TabKeyBinding="{value: Id}">
<TabContentTemplate>
<ul>
<dot:Repeater DataSource="{value: Cities}">
<ItemTemplate>
<li>{{value: _this}}</li>
</ItemTemplate>
</dot:Repeater>
</ul>
</TabContentTemplate>
</bp:TabControl>
<br />
<dot:Repeater DataSource="{value: Countries}">
<ItemTemplate>
{{value: Name}} Tab {{value: IsSelected ? "is" : "is not"}} selected.
<br />
</ItemTemplate>
</dot:Repeater>
using System.Collections.Generic;
using DotVVM.Framework.ViewModel;
namespace DotvvmWeb.Views.Docs.Controls.businesspack.TabControl.sample3
{
public class ViewModel : DotvvmViewModelBase
{
public List<Country> Countries { get; set; } = new List<Country> {
new Country { Id = 1, Name = "Czech Republic", Cities = new List<string> { "Praha", "Brno" } },
new Country { Id = 2, Name = "Slovakia", Cities = new List<string> { "Bratislava", "Košice" } }
};
}
}
using System.Collections.Generic;
namespace DotvvmWeb.Views.Docs.Controls.businesspack.TabControl.sample3
{
public class Country
{
public int Id { get; set; }
public string Name { get; set; }
public List<string> Cities { get; set; } = new List<string>();
public bool IsEnabled { get; set; } = true;
public bool IsSelected { get; set; }
}
}
Properties
Name | Type | Description | Notes | Default Value | |
---|---|---|---|---|---|
ActiveTabKey | Object | Gets or sets the key of a tab that is currently active. |
attribute
bindable
|
null | |
ClientIDMode | ClientIDMode | Gets or sets the client ID generation algorithm. |
attribute
static value
|
Static | |
DataContext | Object | Gets or sets a data context for the control and its children. All value and command bindings are evaluated in context of this value. The DataContext is null in client-side templates. |
attribute
bindable
|
null | |
DataSource | IEnumerable | Gets or sets the data source containing data for this control. |
attribute
bindable
|
null | |
ID | String | Gets or sets the control client ID within its naming container. |
attribute
static value
bindable
|
null | |
IncludeInPage | Boolean | Gets or sets whether the control is included in the DOM of the page. |
attribute
bindable
|
True | |
InnerText | String | Gets or sets the inner text of the HTML element. Note that this property can only be used on HtmlGenericControl directly and when the control does not have any children. |
attribute
static value
bindable
|
null | |
TabContentTemplate | ITemplate | Gets or sets the template rendering contents of tabs. This property is used when tabs are loaded from the DataSource property. |
inner element
static value
bindable
|
null | |
TabEnabledBinding | IValueBinding<Boolean?> | Gets or sets the binding which retrieves whether a tab from DataSource is enabled and can be activated. |
attribute
bindable
|
null | |
TabHeaderTemplate | ITemplate | Gets or sets the template for headers of tabs. This property is used when tabs are loaded from the DataSource property. |
inner element
static value
bindable
|
null | |
TabHeaderTextBinding | IValueBinding<String> | Gets or sets the binding which retrieves the text of the header a tab from DataSource. |
attribute
bindable
|
null | |
TabIsActiveBinding | IValueBinding<Boolean?> | Gets or sets the binding which determines whether a tab from DataSource is active or not. Only one tab can be active at the same time. |
attribute
bindable
|
null | |
TabKeyBinding | IValueBinding | Gets or sets the binding which retrieves the unique key of a tab from DataSource. |
attribute
bindable
|
null | |
Tabs | List<TabItem> | Gets or sets a collection of tabs rendered inside. |
inner element
static value
bindable
default
|
null | |
TabVisibleBinding | IValueBinding<Boolean?> | Gets or sets the binding which retrieves whether a tab from DataSource is visible. |
attribute
bindable
|
null | |
Visible | Boolean | Gets or sets whether the control is visible. When set to false, `style="display: none"` will be added to this control. |
attribute
bindable
|
True |
Events
Name | Type | Description | |
---|---|---|---|
ActiveTabChanged | Command | Gets or sets the command triggered when the active tab is changed. |