目前我有一个带有几个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是唯一未更新的属性。
我似乎无法重现你的问题。选择第二个选项卡时,应打印出“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));
//...
}
}