2010-12-08 15 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にバインドすることはできません。過去に使用した2つのオプションがあります。コンバーターを使用する代わりに、ViewModel(またはバインドしているもの)のプロパティを作成してコンバージョンを行います。それでもコンバーターのルートに行きたい場合は、バインドされたオブジェクト全体をコンバーターに渡して、そのように計算を行うことができます。

+8

+1。 – iMatoria

+3

'DependencyObject'などからコンバーターを継承する方法はありませんか?私はカスタムコントロールをオーサリングしており、コントロールの別のプロパティに従ってバインドされたオブジェクトをフォーマットする必要があります。 – Shimmy

+2

「バインドされたオブジェクト全体をコンバーターに渡す」とはどういう意味ですか? –

20

もう1つの方法は、他のコンバータをラップするカスタムコンバータを作成し、プロパティからコンバーターのパラメータを渡すことです。このカスタムコンバータがDependencyObjectを継承し、DependencyPropertyを使用する限り、それをバインドできます。例:

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

    <c:ConverterParamHelper.Converter> 

     <c:RealConverter/> 

    </c:ConverterParamHelper.Converter> 

</c:ConverterParamHelper> 
+1

+1 - 私の意見では、これは非常に良いアプローチです。 –

+1

MultiBinding(http://www.switchonthecode.com/tutorials/wpf-tutorial-using-multibindings)を使用することよりもこのアプローチに利点がありますか? – Nathan

+1

実装を投稿できますか? –

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" /> 
+0

+1。 – Rodolphe

+0

これはうまくいくように見えますが、古い "DataElement = null"というビジネス要素を対象にFrameworkElementまたはFrameworkContentElementを見つけることができません。 UnitPropFromDataContextはviewmodelのプロパティですか?バインディングにDataItemが存在しない場合は、それは重要ではありません。 –

+0

これは恐ろしいですが、それは私のために働く唯一のものです:void View_DataContextChanged(オブジェクト送信者、DependencyPropertyChangedEventArgs e){(FindResource( "ConverterKey")ConverterType).PropertyName =(ViewModelTypeとしてDataContext).ViewModelProperty; } –

関連する問題