在MVVM模式中转换值(kg到lbs)

时间:2011-06-07 17:31:55

标签: mvvm

我正在构建一个可以跟踪重量的应用。我允许用户选择他们的单位偏好kg或lbs。我希望将数据保存在DB标准(kg)中,因此如果用户选择lbs作为他们的首选项,我需要在UI中将数据从kg转换为lbs。

4 个答案:

答案 0 :(得分:7)

可以在ViewModel中轻松处理此转换。

这是拥有ViewModel的巨大优势之一 - 您可以轻松测试逻辑,例如单元之间的转换,与用户界面代码完全分开。

答案 1 :(得分:1)

我建议你使用它的DataBinding的Coverter属性,并通过XAML解决它。

DataBinding = { Binding Path = YourProperty,Converter = {StaticResource YourConverter}}

YourConverter必须实现IValueConverter的转发(msdn doc),并且必须声明为Resource。

我更喜欢这种方法,因为在视图端保留转换逻辑。

答案 2 :(得分:0)

我想我们在WPF。使用Binding Converter并创建一个实现IValueConverter的对象,进行正确的配置转换。

答案 3 :(得分:0)

我可以解释的最好方法是使用自定义转换器接口。而不是谈论我只会给你一个例子。

    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是可行的方法,但对于您的方案,这更容易维护和扩展。