如何在自定义XAML中的DataTemplate时从DataTemplate获取控件

时间:2014-08-20 14:04:01

标签: c# wpf mvvm custom-controls datatemplate

在运行时添加选项卡并且在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是普通类,不能在其上应用模板。

0 个答案:

没有答案