在运行时添加选项卡并且在XAML中自定义DataTemplate
以使用普通类作为数据源时,是否可以解释如何获取TabControl
中指定的控件?这是场景。
我有一个班级
public class TabContent
{
public string Header { get; set; }
public string Code { get; set; }
public bool Modified { get; set; }
}
以下是TabControl
的XAML自定义:
<TabControl x:Name="tabControl" SelectionChanged="tabControl_SelectionChanged">
<!-- Header -->
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock x:Name="txtHeader" Text="{Binding Header}" />
</DataTemplate>
</TabControl.ItemTemplate>
<!-- Content -->
<TabControl.ContentTemplate>
<DataTemplate>
<!-- Code -->
<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
<DockPanel>
<ListBox x:Name="lbLines" Width="Auto"
Margin="2,3.1,2,2"
FontFamily="Consolas"
HorizontalContentAlignment="Right">
<!-- ...snip.. -->
</ListBox>
<TextBox x:Name="editor"
Text="{Binding Code}"
AcceptsReturn="True" AcceptsTab="True"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
FontFamily="Consolas">
</TextBox>
</DockPanel>
</ScrollViewer>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
而且,这里是代码背后的文字:
ObservableCollection<TabContent> _tabContents = new ObservableCollection<TabContent>();
//In constructor..
public MainWindow() {
tabControl.ItemsSource = _tabContents;
}
void loadTab() {
var t = new TabContent()
{
Header = "Code File 1",
Code = File.ReadAllText(@"C:\code.txt")
};
_tabContents.Add(t);
tabControl.SelectedItem = tabControl.Items[tabControl.Items.Count - 1];
}
现在,当用户点击标签时,我想在其中获取文本框控件。
private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//how do I get the "editor" textbox and "lbLines" ListBox objects ???
}
=================
为什么MSDN方法在这里不起作用:http://msdn.microsoft.com/en-us/library/bb613579(v=vs.110).aspx
TabControl中的项目是TabContent类型而不是TabItem。因此,MSDN示例无法获取控件,因为它不符合条件:“为了获取控件,必须将模板应用于项目。” 这里,TabContent是普通类,不能在其上应用模板。