Лучший способ объяснить это - использовать пользовательский интерфейс конвертера. Вместо того чтобы говорить дальше, я приведу вам пример.
private IConverter<Double, Double> weightConverter = new KgToLbsConverter();
private double _weight;
public double Weight
{
get
{
return weightConverter.ConvertFrom(_weight);
}
set
{
_weight = weightConverter.ConvertTo(value);
RaisePropertyChanged(() => Weight);
}
}
/// <summary>
/// Provides a simple converter contract.
/// </summary>
/// <typeparam name="T">The source Type</typeparam>
/// <typeparam name="R">The target Type.</typeparam>
public interface IConverter<T, R>
{
R ConvertFrom(T value);
T ConvertTo(R value);
}
/// <summary>
/// Provides a converter to change Kg to Lbs and vice versa
/// </summary>
public class KgToLbsConverter : IConverter<Double, Double>
{
/// <summary>
/// From Kg to Lbs.
/// </summary>
/// <param name="value">The weight in Kg.</param>
/// <returns>The weight in Lbs.</returns>
public double ConvertFrom(double value)
{
return value / 2.2;
}
/// <summary>
/// From Lbs to Kg.
/// </summary>
/// <param name="value">The weight in Lbs.</param>
/// <returns>The weight in Kg.</returns>
public double ConvertTo(double value)
{
return value * 2.2;
}
}
Используя это, вы можете сделать любые конвертеры, какие захотите, и затем позволить пользователю выбирать из конкретных реализаций.
Примечание. Причина, по которой я предпочитаю это преобразователям, заключается в том, что моделям представлений может понадобиться знать, какой режим преобразования активен и как с ними работать, это добавляет немало гибкости. Когда вам нужно одно преобразование для взаимосвязи V-VM, тогда IValueConverter - это то, что вам нужно, но для вашего сценария это легче поддерживать и расширять.