2010-12-08 45 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" />