具有绑定依赖属性的IValueConverter

我需要在运行时根据要绑定的对象中标识的单位系统确定某些绑定TextBlocksStringFormat

我有一个具有依赖属性的转换器,我想绑定到。 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(); } } 

我宣布转换器

  

并绑定TextBlock

  

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

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

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

如果BreadthIsMetric是同一数据对象的属性,则可以将MultiBinding与多值转换器结合使用:

         

使用这样的转换器:

 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,并且以后永远不会得到它。

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