【问题标题】:WPF MVVM Tabconrol highlight tab with validation errorWPF MVVM Tabconrol 突出显示带有验证错误的选项卡
【发布时间】:2019-02-13 10:40:02
【问题描述】:

我正在使用 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>

我的任务是当我单击右侧面板中的按钮时,它必须导航到出现此验证错误的选项卡。

如有任何帮助,我们将不胜感激。

【问题讨论】:

    标签: c# wpf validation mvvm tabcontrol


    【解决方案1】:

    我不知道有什么合适的方法来实现这一点 但是从您长期以来一直在寻找解决方案的事实来看,我为您破解了一些可怕的东西,这将起到作用。 先添加这个类

      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);
                    }
                }
            }
    

    【讨论】:

    • 非常感谢,但这适用于 MVVM 吗?或者我应该把它放在用户控件后面的代码中。
    • 这可能不会在您的视图模型中工作:/
    猜你喜欢
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2014-05-02
    相关资源
    最近更新 更多