c# - WPF MVVM Tabconrol 突出显示带有验证错误的选项卡
问题描述
我正在使用 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>
我的任务是当我单击右侧面板中的按钮时,它必须导航到带有此验证错误的选项卡。
请任何帮助将不胜感激。
解决方案
我不知道有什么合适的方法来实现这一点,但从你长期以来一直在寻找解决方案的事实来看,我为你破解了一些可怕的东西,这将起到作用。先添加这个类
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);
}
}
}
推荐阅读
- javascript - 我们如何停止将 UTC 日期时间对象从转换为本地日期时间?
- r - “自包含”函数在 R 中是否更有效?
- git - 仅获取基本分支中不存在的提交范围
- mysql - 数据库监控以获取交易详情
- android - 安装使用 Chrome 下载的 apk 时出现解析错误,但使用 Firefox 下载时工作正常
- python - Flask RESTful - 查询 SQLalchemy 返回两个列表
- reactjs - this.props.navigation.navigate() 不起作用(使用 WithNavigation)
- javascript - Javascript未捕获的TypeError:无法读取null的属性'src'
- html - 垂直对齐搜索栏内的图标
- reactjs - 如何使用 Reactjs 和 create-react-app 修复科尔多瓦应用程序上的静态图像“加载资源失败:net::ERR_FILE_NOT_FOUND”