Есть ли способ связать несколько преобразователей значений в XAML?
У меня есть ситуация, в которой мне нужно показать целое значение, привязанное к свойству в моем контексте данных, после того, как он прошел через два отдельных преобразования:
- изменить значение в пределах диапазона (например, диапазон от 1 до 100; значение в datacontext 90; пользователь видит значение 10)
- преобразовать число в строку
Я понимаю, что я мог бы сделать оба шага, создав свой собственный конвертер (который реализует IValueConverter). Тем не менее, у меня уже есть отдельный преобразователь значений, который выполняет только первый шаг, а второй шаг покрывается Int32Converter.
есть ли способ, которым я могу связать эти два существующих класса в XAML без необходимости создавать дополнительный класс, который объединяет их?
Если мне нужно уточнить что-либо из этого, пожалуйста, дайте мне знать. :)
спасибо.
4 ответа:
Я этот метод Гарет Эванс в моем проекте Silverlight.
вот моя реализация этого:
public class ValueConverterGroup : List<IValueConverter>, IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture)); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion }
который затем может быть использован в XAML следующим образом:
<c:ValueConverterGroup x:Key="InvertAndVisibilitate"> <c:BooleanInverterConverter/> <c:BooleanToVisibilityConverter/> </c:ValueConverterGroup>
нашел именно то, что искал, любезно предоставлено Джошем Смитом: Преобразователи Значений Трубопроводов (Ссылка archive.org ).
он определяет a
ValueConverterGroup
класс, использование которого в XAML именно так, как я надеялся. Вот пример:<!-- Converts the Status attribute text to a SolidColorBrush used to draw the output of statusDisplayNameGroup. --> <local:ValueConverterGroup x:Key="statusForegroundGroup"> <local:IntegerStringToProcessingStateConverter /> <local:ProcessingStateToColorConverter /> <local:ColorToSolidColorBrushConverter /> </local:ValueConverterGroup>
большой материал. Спасибо, Джош. :)
Да, есть способы цепных преобразователей, но это не выглядит красиво, и вам это не нужно здесь. Если вам когда-нибудь понадобится это, спросите себя, действительно ли это путь? Простой всегда работает лучше, даже если вам нужно написать свой собственный конвертер.
в вашем конкретном случае, все, что вам нужно сделать, это формат преобразовать значение в строку.
StringFormat
свойстваBinding
это ваш друг здесь.<TextBlock Text="{Binding Value,Converter={StaticResource myConverter},StringFormat=D}" />
города на проект Гарета Эванса Silverlight отлично, однако он не поддерживает различные параметры преобразователя.
Я изменил его, чтобы вы могли предоставить параметры, разделенные запятыми (если вы не избегаете их, конечно).
конвертер:
public class ValueConverterGroup : List<IValueConverter>, IValueConverter { private string[] _parameters; public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if(parameter != null) _parameters = Regex.Split(parameter.ToString(), @"(?<!\),"); return (this).Aggregate(value, (current, converter) => converter.Convert(current, targetType, GetParameter(converter), culture)); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } private string GetParameter(IValueConverter converter) { if (_parameters == null) return null; var index = IndexOf(converter as IValueConverter); string parameter; try { parameter = _parameters[index]; } catch (IndexOutOfRangeException ex) { parameter = null; } if (parameter != null) parameter = Regex.Unescape(parameter); return parameter; } }
Примечание: ConvertBack не реализован здесь, см. my суть для полного версия.
реализация:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:converters="clr-namespace:ATXF.Converters;assembly=ATXF" x:Class="ATXF.TestPage"> <ResourceDictionary> <converters:ValueConverterGroup x:Key="converters"> <converters:ConverterOne /> <converters:ConverterTwo /> </converters:ValueConverterGroup> </ResourceDictionary> <Label Text="{Binding InitialValue, Converter={StaticResource converters}, ConverterParameter='Parameter1,Parameter2'}" /> </ContentPage>