我不得不阻止用户在WPF TabControl中选择一个tabitem,
1)除非并且直到用户在一个条件下选中复选框,否则应该向用户显示一个消息框,如果他勾选复选框,他可以导航到任何其他选项卡
2)检查特定条件,用户在选择它时不应该进入特定标签,我没有选项让标签项崩溃。它应该弹出一个消息框并返回到选择相同的prv标签项目
我已经看过史密斯乔希的示例代码如下所示,这就是我对第一个场景的确切需要
http://joshsmithonwpf.wordpress.com/2009/09/04/how-to-prevent-a-tabitem-from-being-selected/
但是我需要一些适用于MVVM的东西,我的应用程序有严格的“No CodeBehind”
答案 0 :(得分:0)
您可以继承TabControl(或添加附加属性),它控制是否允许导航到另一个标签项;但是,让我强调“没有代码隐藏”有点傻 - 有很多时候代码隐藏可以用于仅查看目的,这没关系。
回到问题...你使用我的建议做的是在控件内隐藏代码隐藏(检查是否允许操作),以便实际视图(页面/窗口等)不会包含它。如果将新属性声明为DependencyProperty,则会获得所有绑定工具等。
答案 1 :(得分:0)
编辑:我测试了我的其他代码但是没有用。反正只是一个想法。这是一个有效的方法(尽管我同意Alex的观点,调整视图时MVVM背后的代码很好)。
在这种情况下,我创建了一个转换器,它接受两个布尔值:如果选中了选项卡,我们是否可以更改选项卡。如果这两个都设置为false,则返回false以禁用选项卡。如果其中一个设置为true,我们将启用该选项卡。
这是代码。我的VM中有一个名为CanChangeTabs的属性,Window.Resources中有一个名为Converter的MyConverter实例。
XAML inTabItem:
<TabItem.IsEnabled>
<MultiBinding Converter="{StaticResource Converter}">
<Binding RelativeSource="{RelativeSource Self}" Path="IsSelected" />
<Binding Path="CanChangeTabs" />
</MultiBinding>
</TabItem.IsEnabled>
转换器:
public class MyConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
foreach (object value in values)
{
if ((bool)value)
{
return true;
}
}
return false;
}
public object[] ConvertBack(object values, Type[] targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}