2013-11-28 33 views
1

我有一个文本框绑定到一个属性(最终很多这些)。该属性是一个数值。当显示这个数值时,我想给它增加一个单位(如V,mV,C等),并可选择缩放(例如3200mV = 3.2V)。目前我正在使用一个值转换器并提供一个单位作为转换器参数,但是我仍然需要一个转换器将其传回。c#wpf IValueConverter和属性属性

但是我想要做的是添加一个自定义属性到一个属性与所需的规模和单位。事情是这样的:

[Unit("mV")] 
[Scale(0.1)] 
public uint MyProperty 
{ 
    get{ return myProperty} 
    set 
    { 
     if(value==myProperty) 
     return; 
     myProperty=value; 
     OnPropertyChanged("MyProperty");  
    } 
} 

但是我不知道它怎么可能这样的信息传递给转换器(如果它甚至有可能)?

或者有什么其他的可能性,以一种很好的方式做到这一点?

回答

1

要从UnitAttribute和ScaleAttribute获取属性值,值转换器必须使用Reflection,并且必须知道这些属性所在类的名称以及要转换的特定属性的名称。

您可以为类名称添加一个DependencyProperty到你的价值转换器并使用它,如下所示:

<UserControl.Resources> 
    <local:MyUnitConverter x:Key="myUnitConverter" ClassName="MyNamespace.MyClass" /> 
</UserControl.Resources> 

,然后使用转换器的性能,也传递性质为ConverterParameter的名称:

<TextBlock Text="{Binding MyProperty, Converter={StaticResource myUnitConverter}, 
    ConverterParameter=MyProperty}" /> 

然后应该可以从转换器找到属性中使用的值并相应地转换属性。

public class MyUnitConverter : DependencyObject, IValueConverter 
{ 
    // add dependency property ClassName as string 

    public object Convert(object value, Type targetType, object parameter, CultureInfo info) 
    { 
     // use dependency property ClassName and (string)parameter 
     // as property name to get the attribute values using Reflection. 
    } 
} 
+0

不错。这实际上回答了我的另一个问题:如何在需要转换回来时获取目标属性的类型。 – xnonamex

+0

@xnonamex我的回答并不完整,但它应该引导您朝着正确的方向前进。关键是将信息传递给值转换器对象。我希望你知道如何使用Reflection获得属性值。如果没有,我相信你可以在这个网站上找到答案。 – helb

+0

我会最终弄清楚......将研究它。只要我知道在哪个方向思考应该没问题。 :) – xnonamex