在MVVM模式中转换值(千克到磅)

在MVVM模式中转换值(千克到磅),mvvm,Mvvm,我正在开发一个可以跟踪体重的应用程序。我允许用户选择他们的单位首选项kg或lbs。我希望将数据保留在DB标准(kg)中,因此如果用户选择lbs作为他们的首选项,我需要在UI中将数据从kg转换为lbs。此转换可以在ViewModel中轻松处理 这是拥有ViewModel的巨大优势之一—您可以轻松地测试逻辑,例如单元之间的转换,它与用户界面代码完全分离。我建议您使用数据绑定的it Converter属性,并通过XAML解决它 DataBinding = { Binding Path = YourPr

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

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


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

我建议您使用数据绑定的it Converter属性,并通过XAML解决它

DataBinding = { Binding Path = YourProperty,Converter = {StaticResource YourConverter}}
您的转换器必须实现IValueConverter inferface(),并且必须声明为资源


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

我假设我们在WPF中。使用并创建一个实现IValueConverter的对象,执行正确配置的转换。

我可以解释的最好方法是使用自定义转换器接口。我不谈这些,只给你举个例子

    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;
        }
    }
private-IConverter-weightConverter=new-kgtolbconverter();
私人双倍重量;
公众双倍重量
{
得到
{
返回权重转换器。转换自(_-weight);
}
设置
{
_重量=重量转换器。转换为(值);
提升性能改变(()=>重量);
}
}
/// 
///提供一个简单的转换器契约。
/// 
///源类型
///目标类型。
公共接口IConverter
{
R(T值);
T(R值);
}
/// 
///提供一个转换器,将千克转换为磅,反之亦然
/// 
公共类KgToLbsConverter:IConverter
{
/// 
///从公斤到磅。
/// 
///重量以千克为单位。
///重量单位为磅。
公共双值转换源(双值)
{
返回值/2.2;
}
/// 
///从磅到公斤。
/// 
///重量单位为磅。
///重量以千克为单位。
公共双转换器(双值)
{
返回值*2.2;
}
}
使用它,您可以制作任何您想要的转换器,然后让用户从具体实现中进行选择


注意:我之所以喜欢这种转换器,是因为视图模型可能需要知道什么转换模式是活动的,以及如何使用它们,这增加了相当多的灵活性。当您需要对V-VM关系进行一次转换时,IValueConverter是一种可行的方法,但对于您的场景,这更易于维护和扩展。

谢谢,这是我正在寻找的解决方案。在阅读了Josh Smith的一些文章后,我认为价值转换不是一种可行的方法。具体来说,Josh说视图模型只是一个基于类固醇的值转换器。Thanks@John:是的,这是我的想法。在ViewModel中有更多的控制,包括(至少很容易)使用许多属性转换,而不仅仅是有问题的属性。。。