Как в xaml делать несколько конвертеров?

В ангуляре можно сделать несколько фильтров над текстом к пример
<div ng-bind="vm.value | filter1| filter2| filter3"

И последовательность при том сохраняется.
Как такое сделать в XAML? в частности в ксмарине, но тут ничего отлчиного я как понял от просто xaml нет
<Label Font="20"  Text="{Binding MovingState.HashRate,Converter={StaticResource FloatConverter...

Хотелось бы к примеру сначало дабл конверитть в строку, затем что то делать со строкой еще до кучи, а еще лучше чтоббы при этом парамтеров можно было передавать неограничено, иначе наплодил я тут же конвертеров эттих
  • Вопрос задан
  • 411 просмотров
Решения вопроса 2
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 используется, чтобы не создавать кучу конвертеров в ресурсах
Ответ написан
AxisPod
@AxisPod
Поглядите как сделано это в Catel, может натолкнёт на нужные мысли.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы