具有绑定依赖属性的IValueConverter

本文关键字:IValueConverter 属性 依赖 绑定 | 更新日期: 2023-09-27 18:29:50

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

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

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:Path=IsMetric;DataItem=null;目标元素是"UnitConverter"(哈希代码=62641008);目标属性为"IsMetric"(类型为"Boolean")

我想这是在我设置datacontext之前初始化的,因此没有什么可以绑定IsMetric属性。我如何才能获得所需的结果?

具有绑定依赖属性的IValueConverter

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

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

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