阻止用户选择选项卡WPF选项卡项

阻止用户选择选项卡WPF选项卡项,wpf,mvvm,tabcontrol,tabitem,Wpf,Mvvm,Tabcontrol,Tabitem,我必须阻止用户在WPF TabControl中选择tabitem 1) 除非并直到用户选中某个条件中的复选框,否则应向用户显示一个消息框,如果用户选中该复选框,则可以导航到任何其他选项卡 2) 选中特定条件用户在选择某个特定选项卡时不应进入该选项卡,并且我没有使选项卡项折叠的选项。它应弹出一个消息框并返回到选定的同一prv选项卡项 我看到了Smith Josh的示例代码,如下所示,这正是我在第一个场景中想要的 但是我需要在MVVM中工作的东西,我的应用程序有一个严格的“无代码隐藏”您可以继承T

我必须阻止用户在WPF TabControl中选择tabitem

1) 除非并直到用户选中某个条件中的复选框,否则应向用户显示一个消息框,如果用户选中该复选框,则可以导航到任何其他选项卡

2) 选中特定条件用户在选择某个特定选项卡时不应进入该选项卡,并且我没有使选项卡项折叠的选项。它应弹出一个消息框并返回到选定的同一prv选项卡项

我看到了Smith Josh的示例代码,如下所示,这正是我在第一个场景中想要的


但是我需要在MVVM中工作的东西,我的应用程序有一个严格的“无代码隐藏”

您可以继承TabControl(或添加附加属性),它控制是否允许导航到另一个选项卡项;然而,我要强调的是,“没有代码隐藏”有点傻——很多时候代码隐藏可以用于只查看的目的,这没关系


回到问题上来。。。使用我的建议可以将代码隐藏在控件中(检查是否允许该操作),以便实际视图(页面/窗口等)不包含它。如果您将新属性声明为DependencyProperty,您将获得所有绑定功能等。

编辑:我测试了其他代码,但它不起作用。不管怎么说,这只是个想法。这里有一个可行的方法(尽管我同意Alex的观点,在调整视图时MVVM中的代码隐藏是可以的)

在本例中,我创建了一个转换器,它接受两个布尔值:如果选择了选项卡,以及是否可以更改选项卡。如果这两个都设置为false,则返回false以禁用选项卡。如果其中一个设置为true,则保持选项卡处于启用状态

这是密码。在我的虚拟机中有一个名为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>

ya尝试了代码,但是抛出了一个错误“附加的属性样式。无法在setter或其基类中定义触发器”。是的,我没有通过编辑器抛出代码,并且忘记了setter的结束标记。我决定尝试一下代码,但它无论如何都不起作用,所以我用一个有效的解决方案更新了帖子。代码确实起作用,但唯一的问题是,只有在我进入“特定”选项卡后,它才被禁用,这是bcoz,只有在选择了该特定选项卡项后,才能启用该转换器。对于Josh Smith文章的链接+1。伟大的是的,我已经准备好使用代码隐藏,但是所有数据dn数据上下文都是从视图模型驱动的,这在某种程度上阻碍了我将所有实现从视图模型分离到代码隐藏。
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();
    }
}