2012-04-02 119 views
8

我需要在运行时根据要绑定的对象中标识的单位系统确定某个绑定TextBlocksStringFormat具有绑定相关属性的IValueConverter

我有一个转换器,我想绑定一个依赖属性。 Bound值用于确定转换过程。

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(); 
    } 
} 

我宣布的转换器

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

,并绑定TextBlock的

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

从来没有少,我得到以下错误:

System.Windows.Data错误: 2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径= IsMetric;的DataItem = NULL;目标元素是'UnitConverter'(HashCode = 62641008);目标属性是'IsMetric'(类型'布尔')

我想这是在我设置datacontext之前初始化,因此没有什么可以绑定IsMetric属性。我怎样才能达到预期的效果?

回答

6

只要BreadthIsMetric是相同的数据对象的属性,你可能会结合使用MultiBindingmulti value converter

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

与转换器这样的:

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(); 
    } 
} 

问题你的方法是,当UnitConverter被声明为资源时,它没有DataContext,并且它以后永远不会得到。

还有一件重要的事情:ValueChangedUnitConverter.IsMetric的回调是无稽之谈。它再次设置了刚刚更改的相同属性。

+0

我想避免这种情况,因为我有数百个TextBlocks,我不想经过并改变它们。 – 2012-04-02 19:16:21

+0

谢谢你,是的,我意识到我只是设置相同的属性,以及如果它曾经被称为是!然而,MultiBinding很有效 – 2012-04-02 19:34:26