Ответы пользователя по тегу Angular
  • Как в xaml делать несколько конвертеров?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    В вашем случае, подойдёт создание специального кастомного конвертера, который сделает и из числа в строку, и потом строку обработает.

    Другой вариант - MultiBinding. Создаётся специальный мультиконвертер, в который указывается несколько обычных биндингов. Но они обрабатываются параллельно, поэтому, если нужно вначале делать первый конвертер, а потом использовать его результат в другом конвертере, то так не получится, все данные обрабатываются в мультиконвертере.

    Но мультибиндинг работает в WPF, а в Silverlight нет. Но для Silverlight есть workaround: www.codeproject.com/Articles/286171/MultiBinding-i...

    Вот пример мультиконвертера, который берёт несколько bool, и проверяет, все ли они истинны (или ложны - можно выбрать).

    Использование конвертера:
    xmlns:converters="clr-namespace:MyProject.Converters"
    
    <CheckBox x:Name="Checkbox1" Content="Чекбокс 1"/>
    <CheckBox x:Name="Checkbox2" Content="Чекбокс 2"/>
    <ToggleButton Content="Кнопка">
        <ToggleButton.IsEnabled>
            <MultiBinding Converter="{converters:BooleanMultiConverter Type=AllTrue}">
                <Binding Path="IsChecked" ElementName="Checkbox1"/>
                <Binding Path="IsChecked" ElementName="Checkbox2"/>
            </MultiBinding>
        </ToggleButton.IsEnabled>
    </ToggleButton>

    Сам конвертер:
    using System;
    using System.Linq;
    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Markup;
    
    namespace MyProject.Converters
    {
        public class BooleanMultiConverter : MarkupExtension, IMultiValueConverter
        {
            /// <summary>
            /// Перечисление типа конвертера
            /// </summary>
            public enum Types
            {
                AllTrue,
                AllFalse,
                AnyTrue,
                AnyFalse,
            }
    
            /// <summary>
            /// Тип конвертера, по умолчанию - AllTrue
            /// </summary>
            public Types Type { get; set; }
    
            public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                switch (Type)
                {
                    case Types.AllTrue:
                        return values.All(v => (bool)v);
                    case Types.AllFalse:
                        return values.All(v => !(bool)v);
                    case Types.AnyTrue:
                        return values.Any(v => (bool)v);
                    case Types.AnyFalse:
                        return values.Any(v => !(bool)v);
                    default:
                        throw new InvalidOperationException();
                }
            }
    
            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
            {
                return new[] { DependencyProperty.UnsetValue };
            }
    
            #region MarkupExtension
    
            public BooleanMultiConverter()
            {
            }
    
            /// <summary>
            /// Отображать конвертер в списке
            /// </summary>
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return this;
            }
    
            #endregion
        }
    }

    MarkupExtension используется, чтобы не создавать кучу конвертеров в ресурсах
    Ответ написан
    2 комментария