Привязка к параметру преобразователя - PullRequest
43 голосов
/ 08 декабря 2010

Возможно ли привязать к ConverterParameter в Silverlight 4.0?

Например, я хотел бы сделать что-то подобное и связать ConverterParameter с объектом в ViewModel, например.

Если это невозможно, есть ли другие варианты?

<RadioButton
  Content="{Binding Path=Mode}"
  IsChecked="{Binding
    Converter={StaticResource ParameterModeToBoolConverter},
    ConverterParameter={Binding Path=DataContext.SelectedMode,ElementName=root}}"
/>

Ответы [ 3 ]

54 голосов
/ 29 января 2011

К сожалению, нет, вы не можете привязать к параметру ConverterParameter.В прошлом я использовал два варианта: вместо использования конвертера создайте свойство в вашей модели представления (или любой другой объект, к которому вы привязываете), которое выполняет преобразование для вас.Если вы все еще хотите пойти по маршруту Конвертера, передайте весь связанный объект в конвертер, и тогда вы сможете выполнить свой расчет таким образом.

20 голосов
/ 14 января 2012

Другой вариант - это создать собственный конвертер, который обернет ваш другой конвертер и передаст его в свойство параметра. Пока этот пользовательский конвертер наследует DependencyObject и использует DependencyProperty, он может быть связан с. Например:

<c:ConverterParamHelper ConverterParam="{Binding ...}">

    <c:ConverterParamHelper.Converter>

        <c:RealConverter/>

    </c:ConverterParamHelper.Converter>

</c:ConverterParamHelper>
18 голосов
/ 15 февраля 2013

Я знаю, что это старый вопрос, но, возможно, это будет полезно для кого-то, кто сталкивался с этим.Решение, которое я нашел, выглядит следующим образом:

public class WattHoursConverter : FrameworkElement, IValueConverter
    {

        #region Unit (DependencyProperty)

        /// <summary>
        /// A description of the property.
        /// </summary>
        public string Unit
        {
            get { return (string)GetValue(UnitProperty); }
            set { SetValue(UnitProperty, value); }
        }
        public static readonly DependencyProperty UnitProperty =
            DependencyProperty.Register("Unit", typeof(string), typeof(WattHoursConverter),
            new PropertyMetadata("", new PropertyChangedCallback(OnUnitChanged)));

        private static void OnUnitChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((WattHoursConverter)d).OnUnitChanged(e);
        }

        protected virtual void OnUnitChanged(DependencyPropertyChangedEventArgs e)
        {
        }

        #endregion


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
// you can use the dependency property here
...
}
}

и в вашем xaml:

<UserControl.Resources>
    <converters:WattHoursConverter x:Key="WattHoursConverter" Unit="{Binding UnitPropFromDataContext}"/>
 </UserControl.Resources>
....
  <TextBlock Grid.Column="1" TextWrapping="Wrap" Text="{Binding TotalCO2, Converter={StaticResource KgToTonnesConverter}}" FontSize="13.333" />
...