2013-11-28 2 views
1

У меня есть текстовое поле, которое привязано к свойству (в конечном итоге это много). Свойство является числовым значением. При отображении этого численного значения я хотел бы добавить к нему блок (например, V, mV, C и т. Д.) И, при необходимости, масштабировать его (например, 3200 мВ = 3,2 В). В настоящее время я использую один преобразователь значений и поставляю единицу в качестве параметра преобразователя, однако мне все равно понадобится конвертер для его возврата.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