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

时间:2010-08-27 15:24:29

标签: wpf mvvm tabcontrol tabitem

我不得不阻止用户在WPF TabControl中选择一个tabitem,

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

2)检查特定条件,用户在选择它时不应该进入特定标签,我没有选项让标签项崩溃。它应该弹出一个消息框并返回到选择相同的prv标签项目

我已经看过史密斯乔希的示例代码如下所示,这就是我对第一个场景的确切需要

http://joshsmithonwpf.wordpress.com/2009/09/04/how-to-prevent-a-tabitem-from-being-selected/

但是我需要一些适用于MVVM的东西,我的应用程序有严格的“No CodeBehind”

2 个答案:

答案 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();
    }
}