private bool Combine(bool value1, bool value2, LogicalConversionOptions options)
 {
     if (options.HasFlag(LogicalConversionOptions.CombineWithAnd))
     {
         return(value1 && value2);
     }
     else
     {
         return(value1 || value2);
     }
 }
 private bool IsTerminatingValue(bool value, LogicalConversionOptions options)
 {
     if (options.HasFlag(LogicalConversionOptions.CombineWithAnd))
     {
         return(!value);
     }
     else
     {
         return(value);
     }
 }
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            VisibilityAsBooleanConverterOptions options = GetOptions(parameter);

            object[] input = new object[values.Length];
            for (int i = 0; i < values.Length; i++)
            {
                bool?b = GetBool(values[i]);
                if (b != null)
                {
                    input[i] = b.Value;
                }
                else
                {
                    return(null);
                }
            }

            LogicalConversionOptions logicalOptions = LogicalConversionOptions.None;

            if (options.HasFlag(VisibilityAsBooleanConverterOptions.CombineWithAnd))
            {
                logicalOptions |= LogicalConversionOptions.CombineWithAnd;
            }
            else
            {
                logicalOptions |= LogicalConversionOptions.CombineWithOr;
            }

            if (options.HasFlag(VisibilityAsBooleanConverterOptions.Negate))
            {
                logicalOptions |= LogicalConversionOptions.Negate;
            }

            bool boolean = (bool)this.logicalConverter.Convert(input, null, logicalOptions, culture);

            return(GetVisibility(boolean, options));
        }