NullToVisibilityConverter make visible if not null

2019-01-23 06:19发布

问题:

Want to hide and show property grid for SelectedItem in listview

<UserControl xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
      <ListView>
         <!--here is list view-->
      </ListView>
      <xctk:PropertyGrid SelectedObject="{Binding Active}" Visibility="{Binding Active, Converter=NullToVisibilityConverter}" >  
   </xctk:PropertyGrid>
</UserControl>

So I need converter and use it in visibility property converter. Any help?

回答1:

public class NullVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Hidden : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Then reference the NullVisibilityConverter in your XAML Resources.

<StackPanel.Resources>
  <simpleXamlContent:NullVisibilityConverter x:Key="NullToVisibilityConverter"/>
</StackPanel.Resources>


回答2:

To use the converter we can create one in the resources , and refer to it as a static resource in the binding statement.

<UserControl xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit">
    <UserControl.Resources>
      <yournamespace:NullVisibilityConverter x:Key="NullToVisibilityConverter"/>
    </UserControl.Resources>
                  <ListView>
                     <!--here is list view-->
                  </ListView>
                  <xctk:PropertyGrid SelectedObject="{Binding Active}" Visibility="{Binding Active, Converter={StaticResource NullToVisibilityConverter}" >  
               </xctk:PropertyGrid>
            </UserControl>

and Converter is same as above

public class NullVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Hidden : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}


回答3:

There is little more useful version allows to set default invisibility value:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    string defaultInvisibility = parameter as string;
    Visibility invisibility = (defaultInvisibility != null) ?
        (Visibility)Enum.Parse(typeof(Visibility), defaultInvisibility)
        : Visibility.Collapsed;
    return value == null ? invisibility : Visibility.Visible;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return DependencyProperty.UnsetValue;
}

Where ever in resources add:

<converters:NullReferenceToVisibilityConverter x:Key="NullToVis" />

And use it like there:

<StackPanel Visibility="{Binding MyObject, Converter={StaticResource NullToVis}}">
<StackPanel Visibility="{Binding MyObject, Converter={StaticResource NullToVis}, ConverterParameter=Hidden}">


标签: c# wpf xaml mvvm