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