csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.9 KiB
58 lines
1.9 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
|
|
namespace Avalonia.Data.Converters
|
|
{
|
|
/// <summary>
|
|
/// A general purpose <see cref="IValueConverter"/> that uses a <see cref="Func{T1, TResult}"/>
|
|
/// to provide the converter logic.
|
|
/// </summary>
|
|
/// <typeparam name="TIn">The type of the inputs.</typeparam>
|
|
/// <typeparam name="TOut">The output type.</typeparam>
|
|
public class FuncMultiValueConverter<TIn, TOut> : IMultiValueConverter
|
|
{
|
|
private readonly Func<IEnumerable<TIn?>, TOut> _convert;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="FuncValueConverter{TIn, TOut}"/> class.
|
|
/// </summary>
|
|
/// <param name="convert">The convert function.</param>
|
|
public FuncMultiValueConverter(Func<IEnumerable<TIn?>, TOut> convert)
|
|
{
|
|
_convert = convert;
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
|
|
{
|
|
//standard OfType skip null values, even they are valid for the Type
|
|
static IEnumerable<TIn?> OfTypeWithDefaultSupport(IList<object?> list)
|
|
{
|
|
foreach (var obj in list)
|
|
{
|
|
if (obj is TIn result)
|
|
{
|
|
yield return result;
|
|
}
|
|
else if (Equals(obj, default(TIn)))
|
|
{
|
|
yield return default;
|
|
}
|
|
}
|
|
}
|
|
|
|
var converted = OfTypeWithDefaultSupport(values).ToList();
|
|
|
|
if (converted.Count == values.Count)
|
|
{
|
|
return _convert(converted);
|
|
}
|
|
else
|
|
{
|
|
return AvaloniaProperty.UnsetValue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|