2012-04-02 42 views
8

Bağlanacak nesnedeki birim sisteme bağlı olarak, çalışma zamanında TextBlocks'un bir kısmının StringFormat değerini belirlemem gerekir.Bağımlı Bağımlılık Özelliklerine Sahip IValueConverter

Bağlamak istediğiniz Bağımlılık Özelliğiyle bir dönüştürücüm var. Bağlama değeri, dönüşüm sürecinin belirlenmesinde kullanılır.

public class UnitConverter : DependencyObject, IValueConverter 
{ 
    public static readonly DependencyProperty IsMetricProperty = 
     DependencyProperty.Register("IsMetric", typeof(bool), typeof(UnitConverter), new PropertyMetadata(true, ValueChanged)); 

    private static void ValueChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     ((UnitConverter)source).IsMetric = (bool)e.NewValue; 
    } 

    public bool IsMetric 
    { 
     get { return (bool)this.GetValue(IsMetricProperty); } 
     set { this.SetValue(IsMetricProperty, value); } 
    } 

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (IsMetric) 
      return string.Format("{0:0.0}", value); 
     else 
      return string.Format("{0:0.000}", value); 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Ben converter

<my:UnitConverter x:Key="Units" IsMetric="{Binding Path=IsMetric}"/> 

beyan ve TextBlock

<TextBlock Text="{Binding Path=Breadth, Converter={StaticResource Units}}" Style="{StaticResource Values}"/> 

Asla bağlamak az, aşağıdaki hatayı alıyorum:

System.Windows.Data Hatası: 2: Hedef öğe için yönetim FrameworkElement veya FrameworkContentElement bulunamıyor. BindingExpression: Yol = IsMetric; Dataıtem = null; hedef eleman 'UnitConverter' dir (HashCode = 62641008); hedef özellik 'IsMetric' (tür 'Boole') 'dir

Bu, datacontext'i ayarlamadan önce başlatılıyor ve bu nedenle IsMetric özelliğini bağlamak için hiçbir şey yoktur. İstenilen sonuca nasıl ulaşabilirim?

cevap

6

Breadth ve IsMetric aynı veri nesnesinin özellikleridir şartıyla, bir multi value converter ile bağlantılı olarak bir MultiBinding kullanabilir:

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource UnitMultiValueConverter}"> 
      <Binding Path="Breadth" /> 
      <Binding Path="IsMetric" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

bir dönüştürücü ile bu gibi:

public class UnitMultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     double value = (double)values[0]; 
     bool isMetric = (bool)values[1]; 
     string format = isMetric ? "{0:0.0}" : "{0:0.000}"; 
     return string.Format(format, value); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

sorun Yaklaşımınız ile UnitConverter bir kaynak olarak bildirildiğinde DataContext'e sahip olmadığı ve daha sonra asla geri alınmayacağıdır.

Ve daha önemli bir şey: UnitConverter.IsMetric için ValueChanged geri araması anlamsız. Sadece değiştirilen aynı özelliği tekrar ayarlar.

+0

Ben yüzlerce TextBlocks var ve bunu geçmek ve hepsini değiştirmek zorunda kalmak istemediğim gibi bunu önlemek istiyordum. –

+0

Teşekkürler adamım, evet, aynı özelliği kurduğumu fark ettim, eğer böyle denirse! MultiBinding Works Büyük Ancak –

İlgili konular