TabControl SelectedContent不返回当前选定的TabItem内容

问题描述 投票:0回答:1

目前我有一个带有几个TabItem的TabControl。每个TabItem都有一个DataGrid。我想一次格式化这些DataGrids(单元格颜色,列宽等),但我发现我不能,因为隐藏选项卡中的所有DataGrids都会返回null属性。在这种情况下,我尝试在格式化DataGrid之前,以编程方式(或用鼠标手动)选择选项卡。但现在我反对一种“奇怪”的行为:

    private void LeftTabs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Console.WriteLine(LeftTabs.SelectedIndex);
    var currentDataGrid = (DataGrid)LeftTabs.SelectedContent;
    Console.WriteLine(currentDataGrid.Name);
}

所选索引返回正确的选项卡索引,但内容未更新。假设选择了Tab 1,然后我点击Tab 2.它返回Tab 2索引和Tab 1 DataGrid名称。

此行为阻止我编辑选择选项卡的DataGrid,因为即使我尝试直接通过它的对象访问它,所有属性都返回null。

这是TabControl,item和DataGrids XAML代码:

<TabControl Name="LeftTabs" Margin="0,0,0,0"  Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SelectionChanged="LeftTabs_SelectionChanged">
        <TabItem>
            <TabItem.Header>Conditions</TabItem.Header>
            <DataGrid x:Name="DataGrid_Conditions" SelectedCellsChanged="DataGrid_Conditions_SelectedCellsChanged" ColumnWidth="80" ItemsSource="{Binding}" HorizontalAlignment="Stretch"   VerticalAlignment="Top" SelectionChanged="ConditionsSelected" />
        </TabItem>
        <TabItem>
            <TabItem.Header>Signals</TabItem.Header>
            <DataGrid x:Name="DataGrid_Signals" ColumnWidth="80" ItemsSource="{Binding}" HorizontalAlignment="Stretch"  VerticalAlignment="Top" SelectionChanged="SignalsSelected" />
        </TabItem>
    </TabControl>

编辑:为了更清楚,我将最小化方案。 TabItem1 - 里面有DataGrid_Conditions; TabItem2 - 里面有DataGrid_Signals。

这是我手动或以编程方式选择选项卡时尝试运行的另一个代码:

DataGridRow Row = (DataGridRow)DataGrid_Signals.ItemContainerGenerator.ContainerFromIndex(ID);

会发生什么,如果我点击tab2这个代码不适用于tab2的网格。相反,它适用于前一个标签(1)网格。 LeftTabs.SelectedContent是唯一未更新的属性。

c# wpf datagrid tabcontrol
1个回答
1
投票

我似乎无法重现你的问题。选择第二个选项卡时,应打印出“DataGrid_Signals”。您也可以从TabItem获得对当前选定的SelectionChangedEventArgs的引用:

private void LeftTabs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Debug.WriteLine(LeftTabs.SelectedIndex);
    TabItem tabItem = e.AddedItems[0] as TabItem;
    var currentDataGrid = (DataGrid)tabItem.Content;
    Debug.WriteLine(currentDataGrid.Name);
}

在这个例子中,尽管当我尝试从网格对象中获取任何内容时它确实打印了“DataGrid_Signals”,但它只是在隐藏时才为空。

这是因为它尚未加载。您可以通过测量强制它进行渲染并进行排列:

private void LeftTabs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (IsLoaded)
    {
        TabItem tabItem = e.AddedItems[0] as TabItem;
        var currentDataGrid = (DataGrid)tabItem.Content;
        currentDataGrid.Measure(new Size(currentDataGrid.ActualWidth, currentDataGrid.ActualHeight));
        currentDataGrid.Arrange(new Rect(0, 0, currentDataGrid.ActualWidth, currentDataGrid.ActualHeight));
        //...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.