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