TabControl SelectedContent не возвращает текущий выбранный контент TabItem - PullRequest
0 голосов
/ 12 сентября 2018

В настоящее время у меня есть TabControl с несколькими TabItems.Каждый TabItem имеет DataGrid внутри.Я хотел отформатировать эти DataGrids (цвета ячеек, ширину столбцов и т. Д.) Сразу, но я не смог, потому что все DataGrids из скрытых вкладок возвращали бы нулевые свойства.В этом случае я попытался обойти, где я бы программно (или вручную с помощью мыши) выбирал вкладки перед форматированием DataGrid.Но теперь я столкнулся с «странным» поведением:

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

Выбранный индекс возвращает правильный индекс вкладки, но содержимое не обновляется.Допустим, выбрана вкладка 1, а затем я нажимаю на вкладку 2. Она возвращает мне индекс вкладки 2 и имя DataGrid вкладки 1.

Это поведение не позволяет мне редактировать DataGrid выбранной вкладки, потому что даже если я пытаюсьдоступ к нему напрямую через его объект, все свойства возвращают нуль.

Это код XAML TabControl, item и DataGrids:

<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) Grid.LeftTabs.SelectedContent - единственное свойство, которое не обновляется.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Это ошибка, исправленная в .NET 4.7.1, но странная, так что приложения, ориентированные на 4.7 или ниже, все еще имеют старое поведение. Подробнее см. объявление об изменении .

0 голосов
/ 12 сентября 2018

Я не могу воспроизвести вашу проблему. «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));
        //...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...