Ответ 1
Введите FirstDegreeFunctionConverter:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
namespace GenericWPF
{
/// <summary>
/// Will return a*value + b
/// </summary>
public class FirstDegreeFunctionConverter : IValueConverter
{
public double A { get; set; }
public double B { get; set; }
#region IValueConverter Members
public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
double a = GetDoubleValue( parameter, A );
double x = GetDoubleValue( value, 0.0 );
return ( a * x ) + B;
}
public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
double a = GetDoubleValue( parameter, A );
double y = GetDoubleValue( value, 0.0 );
return ( y - B ) / a;
}
#endregion
private double GetDoubleValue( object parameter, double defaultValue )
{
double a;
if( parameter != null )
try
{
a = System.Convert.ToDouble( parameter );
}
catch
{
a = defaultValue;
}
else
a = defaultValue;
return a;
}
}
Как его использовать?
Вы создаете ресурс для каждого использования в разделе ресурсов:
<GenericWPF:FirstDegreeFunctionConverter x:Key="ReverseOne"
A="-1"
B="1" />
<Border Opacity="{Binding Path=Opacity
, ElementName=daOtherField
, Converter={StaticResource ReverseOne}}" />
<GenericWPF:FirstDegreeFunctionConverter x:Key="ListboxItemWidthToErrorWidth"
A="1"
B="-68" />
<TextBox MaxWidth="{Binding Path=ActualWidth
, Converter={StaticResource ListboxItemWidthToErrorWidth}
, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" />
Название происходит от функции y = a * x + b (на норвежском языке называется "функцией первой степени" ), и, конечно, можно было бы обновить ее до второй степени y = a * x ^ 2 + bx + c, но я пока не нашел для него возможности.
У меня была ситуация, когда я хотел создавать столбцы по ширине. Каждый раз, когда я получал 200 пикселей больше ширины, я хотел, чтобы контейнер показывал мне еще один столбец. В то время я жестко закодировал конвертер, но вместо этого я должен был сделать вместо этого y = (a/x) + b.
Теперь, что я должен назвать этим конвертером, чтобы все понимали, что это такое? Поскольку я норвежец, я использовал выражение, которое мы узнали в школе, прямо переведенное. Пожалуйста, если у вас есть предложение или мнение, дайте мне знать. Любые улучшения или улучшения, о которых вы подумали, также будут оценены...
Возможно, " LinearTransformConverter" лучше сообщит, что делает конвертер для вас, я подумаю об этом. Любые другие предложения? Tor