2010-12-08 34 views
43

是否可以绑定到Silverlight 4.0中的ConverterParameter?绑定到转换器参数

例如,我想要做这样的事情,并将ConverterParameter绑定到ViewModel中的对象。

如果这是不可能的,还有其他的选择吗?

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

回答

53

不幸的是,您无法绑定到ConverterParameter。我以前使用过两个选项:不是使用Converter,而是在您的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" />