即使路径设置为false,按钮仍然可见

时间:2015-09-20 19:48:30

标签: c# xaml

 <Button
        VerticalAlignment="Stretch"
        ToolTip="Convert selected Node(s)"
        ToolTipService.ShowOnDisabled="False"
        Visibility="{Binding Source={StaticResource serviceLocator}, Path=NetworkManager.NetworkViewModel.IsGenericProfileLoaded}"
        Command="{Binding Path=ConvertToNonControlPlaneCommand}" >
        <Image
            Style="{StaticResource toolbarImageStyle}"
            Source="/Resources/Icons/equipment_edit.png"
            />

    </Button>

该按钮应折叠或不可见,具体取决于名为IsGenericProfileLoaded的Path属性。即使IsGenericProfileLoaded为false,该按钮仍然可见。如何让它隐形。从stackoverflow上的其他问题来看,似乎我需要visibilitytoBoolean转换器,或者我可以在这里使用任何东西,例如disable =&#34; true&#34;?

1 个答案:

答案 0 :(得分:1)

通常,当数据绑定不起作用时,请在Visual Studio中调试应用程序并查看调试输出。您可以通过以下方式显示调试输出:menu / DEBUG / Windows / Output。进入该页面的应用程序,并密切关注调试输出窗口中显示的消息。您将获得有关哪些不起作用的信息。

你是对的,在你的情况下你需要一个转换器。单独的数据绑定将无法将bool分配给Visibility类型的依赖项属性。

这是一个非常简单的转换器版本:

public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool booleanValue = (value as bool?).GetValueOrDefault();
        return booleanValue ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

您还必须在XAML中添加一个静态引用,使该转换器可用。也许在App.xaml中是这样的:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:converters="clr-namespace:<replace_with_your_namespace>;assembly=<replace_with_your_assembly>">
    ...

    <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />

    ...
</ResourceDictionary>

在您的情况下,可见性必须如下设置:

Visibility="{Binding Source={StaticResource serviceLocator}, Path=NetworkManager.NetworkViewModel.IsGenericProfileLoaded, Converter={StaticResource BoolToVisibilityConverter}}"

您很快就会发现转换器需要更多灵活性。您需要将true转换为Visibility.Collapsed,将false转换为Visibility.Visible。以下是如何在XAML中使用这种更灵活的转换器:

Visibility="{Binding IsLocked, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=not}"

以下是转换器方法必须重写的方法:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    bool booleanValue = (value as bool?).GetValueOrDefault();
    if (parameter != null)
    {
        if (parameter.ToString().Equals("not", StringComparison.OrdinalIgnoreCase))
        {
            booleanValue = !booleanValue;
        }
        else
        {
            throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Invalid value for the BoolToVisibilityConverter parameter: '{0}'. The only valid values are null or 'not' (case insensitive)", parameter));
        }
    }

    return booleanValue ? Visibility.Visible : Visibility.Collapsed;
}