2010-12-08 13 views
43

Silverlight 4.0'da bir ConverterParameter'a bağlamak mümkün mü? Örneğin, böyle bir şey yapmak ve örneğin bir ViewModel'deki bir nesneye ConverterParameter'ı bağlamak istiyorum.Dönüştürücüye Bağlama Parametresi

Bu mümkün değilse başka seçenek var mı?

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

cevap

53

Ne yazık ki hayır, bir ConverterParameter'a bağlayamazsınız. Geçmişte kullandığım iki seçenek var: bir Dönüştürücü kullanmak yerine, ViewModel'inizde (veya sizin bağlayıcınız her neyse) sizin için dönüşüm yapan bir özellik oluşturun. Eğer hala Dönüştürücü rotasına gitmek istiyorsanız, tüm bağlı nesneyi dönüştürücüye verin ve hesaplamalarınızı bu şekilde yapabilirsiniz.

+8

+1 buldum çözüm aşağıdaki gibidir. – iMatoria

+3

Dönüştürücünün 'DependencyObject' vb. Öğelerden mi yoksa bir yolu yok mu? Özel bir denetim yapıyorum ve ilişkili nesneyi denetimdeki başka bir özelliğe göre biçimlendirmem gerekiyor. – Shimmy

+2

"Tüm bağlı nesneyi dönüştürücüye ilet" ile ne demek istiyorsun? –

20

Diğer bir seçenek, diğer dönüştürücünüzü saran ve bir özellikten bir dönüştürücü param biriminde geçiren özel bir dönüştürücü oluşturarak fantezi almaktır. Bu özel dönüştürücü, DependencyObject öğesini devraldığı ve bir DependencyProperty kullandığı sürece, bağlı olabilir. Örneğin:

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

    <c:ConverterParamHelper.Converter> 

     <c:RealConverter/> 

    </c:ConverterParamHelper.Converter> 

</c:ConverterParamHelper> 
+1

+1 - Bence bu çok iyi bir yaklaşım. –

+1

Bir MultiBinding kullanarak bu yaklaşıma bir avantaj var mı (http://www.switchonthecode.com/tutorials/wpf-tutorial-using-multibindings)? – Nathan

+1

Bir uygulama yayınlayabilir misiniz? –

15

Ben eski bir soru ama belki bu karşıya geldi birilerine faydalı olacağını biliyorum.

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 
... 
} 
} 

ve xaml: alternatif yaklaşım için

<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

Çalışması gerektiği gibi görünüyor, ancak eski "Hedef öğe için FrameworkElement veya FrameworkContentElement öğesi bulunamıyor", "DataItem = null" işini alıyorum. UnitPropFromDataContext, görünüm modelinizin bir özelliği mi? Bağlantının hiçbir şekilde DataItem yoksa, önemli değil. –

+0

Bu korkunç bir şey ama benim için çalışan tek şey: void View_DataContextChanged (object sender, DependencyPropertyChangedEventArgs e) {(DönüştürücüType olarak) FindResource ("ConverterKey")) .PropertyName = (ViewModelType olarak DataContext) .ViewModelProperty; } –