将TabItem绑定到列表

本文关键字:列表 绑定 TabItem | 更新日期: 2023-09-27 18:20:47

基本概念是,当用户按下启动按钮,一个新列表从工作线程返回时,它会被添加到"列表列表"中,而不是显示在新创建的选项卡项中。然而,我似乎无法在新创建的选项卡项上获取数据网格。。。。。仍然无法弄清楚,FindName和任何尝试的方法

XAML

<TabControl x:Name="tabMain" Margin="8,63,10,10" IsSynchronizedWithCurrentItem="True" >
    <TabControl.ContentTemplate>
        <DataTemplate>
            <Grid x:Name="grMain" Background="#FFE5E5E5">
                <DataGrid x:Name="dgResults" IsReadOnly="True" AutoGenerateColumns="False" AlternatingRowBackground="#FFAAE8D5" ItemsSource="{Binding data}" >
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Key" Binding="{Binding col1}" Width="150">
                            <DataGridTextColumn.ElementStyle>
                                <Style>
                                    <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>
                        <DataGridTextColumn Header="Value" Binding="{Binding col2}" Width="*">
                            <DataGridTextColumn.ElementStyle>
                                <Style>
                                    <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl >

获取列表后的代码

lstFinal.Add(e.Result as List<Col1Col2>);
TabItem newtab = new TabItem();
newtab.DataContext = lstFinal[lstFinal.Count - 1];

newtab.Header = txtMaterial.Text;
tabMain.Items.Add(newtab);
tabMain.SelectedIndex = tabMain.Items.Count - 1;
DataGrid dg = newtab.FindName("dgResults") as DataGrid;
dg.ItemsSource = lstFinal[lstFinal.Count - 1];

将TabItem绑定到列表

您的问题是因为您试图从DataTemplate中引用控件。在运行时,此模板可能已应用于大量控件,因此首先必须获取应用了该模板的对象,然后,然后您可以从DataTemplate访问该控件。

您可以通过参考MSDN上的how to:find DataTemplate Generated Elements页面来了解如何做到这一点。然而,简而言之,这就是它的做法(从链接页面):

// Getting the currently selected ListBoxItem 
// Note that the ListBox must have 
// IsSynchronizedWithCurrentItem set to True for this to work
ListBoxItem myListBoxItem =
    (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));
// Getting the ContentPresenter of myListBoxItem
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem);
// Finding textBlock from the DataTemplate that is set on that ContentPresenter
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter);
// Do something to the DataTemplate-generated TextBlock
MessageBox.Show("The text of the TextBlock of the selected list item: "
    + myTextBlock.Text);

FindVisualChild方法的定义以及过程的描述也可以在链接页面上找到。