Search code examples
c#.netwpfxamlmultibinding

TextBlock MultiBinding throws exception


A TextBlock, should only be visible if a CheckBox is checked (x:Name=DisplaySubscriber) or the Binding string is not null or empty.

This is my approach:

<CheckBox Content="Display Subscriber" x:Name="DisplaySubscriber" />

<TextBlock Text="{Binding Path=SubscriberString, Mode=OneWay}" >
        <TextBlock.Visibility>
            <MultiBinding>
                <Binding ElementName="DisplaySubscriber" Path="IsChecked" Mode="OneWay" Converter="{StaticResource BooleanToVisibleConverter}"/>                        
                <Binding Path="SubscriberString" Mode="OneWay" Converter="{StaticResource StringIsNullEmptyConverter}"/>    
            </MultiBinding>
        </TextBlock.Visibility>
</TextBlock>

But I got this error:

Provide value on 'System.Windows.Data.MultiBinding' threw an exception.


Solution

  • converter:

    public class TextBlockVisibilityConverter : IMultiValueConverter
    {
        #region IMultiValueConverter Members
    
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if((value[0] != null && (bool)value[0]) || (value[1]!=null && !String.IsNullOrEmpty(value[1].ToString())))
            {
                return Visibility.Visible;
            }    
            return Visibility.Collapsed;
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }
        #endregion
    }
    

    xaml: define the converter in resource:

    <local:TextBlockVisibilityConverter x:Key="TextBlockVisibilityConverter"/>
    

    use it in the multibinding

    <MultiBinding Converter="{StaticResource TextBlockVisibilityConverter}">
                    <Binding ElementName="DisplaySubscriber" Path="IsChecked"/>                        
                    <Binding Path="SubscriberString" />    
    </MultiBinding>