WPF MVVM Tabconrol выделение вкладки с ошибкой проверки - PullRequest
0 голосов
/ 13 февраля 2019

Я использую шаблон WPF MVVM.У меня есть TabControl с несколькими вкладками на нем Все эти вкладки используют одну и ту же модель представления.Все проверки работают правильно, и, как вы можете видеть в приложении, я показываю все ошибки проверки в виде списка сторон.вот мой код xaml:

 <TabControl  Grid.Row="2" Grid.Column="0" VerticalAlignment="Top" SelectedIndex="{Binding SelectedTabIndex}"
            DisplayMemberPath="Content" DropDownDisplayMode="Visible" ScrollMode="Item" BorderThickness="0">
        <TabItem  Header="Job Config"  DropDownContent="Job Config" >

            <TabItem.Content>
                <ScrollViewer  HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                    <local:JobGroupsCars DataContext="{Binding}" Margin="10" IsEnabled="{Binding Job.IsNotInEditMode ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
                </ScrollViewer>
            </TabItem.Content>
        </TabItem>
        <TabItem DropDownContent="Job Info" Header="Job Info">
            <TabItem.Content>
                <ScrollViewer  HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                    <local:JobDetailView DataContext="{Binding}" Margin="10" IsEnabled="{Binding Job.IsNotInEditMode ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                </ScrollViewer>
            </TabItem.Content>
        </TabItem>
        <TabItem DropDownContent="Shipping" Header="Shipping Details">
            <TabItem.Content>
                <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                    <local:JobShippingView DataContext="{Binding}" Margin="10" IsEnabled="{Binding Job.IsNotInEditMode ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                </ScrollViewer>
            </TabItem.Content>
        </TabItem>
        <TabItem DropDownContent="Controller" Header="Controller">
            <TabItem.Content>
                <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                    <local:ControllerView DataContext="{Binding}" Margin="10" IsEnabled="{Binding Job.IsNotInEditMode ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                </ScrollViewer>
            </TabItem.Content>
        </TabItem>

        <TabItem DropDownContent="Ac Motor and Brakes" Header="AC Motor and Brakes" >
            <TabItem.Content>
                <ScrollViewer  HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                    <local:ACMotorView DataContext="{Binding}" Margin="10" IsEnabled="{Binding Job.IsNotInEditMode ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                </ScrollViewer>
            </TabItem.Content>
        </TabItem>
    </TabControl>

enter image description here

моя задача - когда я нажимаю на кнопку на правой панели, она должна перейти на вкладкус этой ошибкой проверки.

пожалуйста, любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 февраля 2019

Я не знаю ни одного более совершенного способа добиться этого, но, судя по тому, что вы долго искали решение, я вместе взломал что-то ужасное для вас, которое поможет.Сначала добавьте этот класс

  public static class UIHelper
    {
        public static T FindChild<T>(this DependencyObject parent, string childName)
        where T : DependencyObject
        {
            if (parent == null) return null;

            T foundChild = null;

            var childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (var i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                var childType = child as T;
                if (childType == null)
                {
                    foundChild = FindChild<T>(child, childName);
                    if (foundChild != null) break;
                }
                else if (!string.IsNullOrEmpty(childName))
                {
                    var frameworkElement = child as FrameworkElement;
                    if (frameworkElement != null && frameworkElement.Name == childName)
                    {
                        foundChild = (T)child;
                        break;
                    }
                }
                else
                {
                    foundChild = (T)child;
                    break;
                }
            }

            return foundChild;
        }
    }

Этот класс найдет детей по имени.Я также собрал это, чтобы представить вашу ситуацию:

    <TabControl Name="ImTheTabControl">
        <TabItem Name="ImTheTab">
            <Grid>
                <TextBox Name="ImTheTextbox"></TextBox>
            </Grid>
        </TabItem>
        <TabItem Name="ImNotTheTab"/>
        <TabItem Name="ImNotTheTabEighter"/>
    </TabControl>

теперь в вашем коде вызовите эту функцию с элементом управления, который содержит ошибку:

         void findPapaTab(Control ctrl)
        {
            foreach (TabItem item in ImTheTabControl.Items)
            {
                if (null != UIHelper.FindChild<TextBox>(item.Content as Grid, ImTheTextbox.Name))
                {
                    MessageBox.Show(item.Name);
                }
            }
        }
...