【问题标题】:c# wpf IValueConverter and property attributesc# wpf IValueConverter和property属性
【发布时间】:2013-11-28 14:58:06
【问题描述】:

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

但是,我想做的是向具有所需比例和单位的属性添加自定义属性。像这样的:

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

但是我不知道如何将此类信息传递给转换器(如果可能的话)?

或者还有什么其他的可能性可以很好地做到这一点?

【问题讨论】:

    标签: c# wpf properties attributes ivalueconverter


    【解决方案1】:

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

    您可以将类名的 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.
        }
    }
    

    【讨论】:

    • 不错。这实际上回答了我的另一个问题:当我需要转换回来时如何获取目标属性的类型。
    • @xnonamex 我的回答不完整,但它应该会引导您朝着正确的方向前进。关键是将信息获取到值转换器对象。我希望您知道如何使用 Reflection 获取属性值。如果没有,我相信你可以在这个网站上找到答案。
    • 我最终会弄清楚的....会调查的。只要我知道思考的方向应该没问题。 :)
    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多