2010-12-08 4 views
43

Можно ли связать с преобразователемпараметр в Silverlight 4.0?Связывание с преобразователем Параметр

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

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

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

ответ

53

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

+8

+1 для альтернативного подхода. – iMatoria 2011-09-05 10:52:18

+3

Не существует способа, чтобы наследовать конвертер из `DependencyObject` и т. Д.? Я создаю настраиваемый элемент управления, и мне нужно отформатировать связанный объект в соответствии с другим свойством элемента управления. – Shimmy 2012-02-22 21:43:10

+2

Что вы подразумеваете под «передать весь связанный объект в конвертер»? – 2012-11-18 00:16:06

20

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

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

    <c:ConverterParamHelper.Converter> 

     <c:RealConverter/> 

    </c:ConverterParamHelper.Converter> 

</c:ConverterParamHelper> 
15

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

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" /> 
Смежные вопросы