值转换器和公制/英制单位

本文关键字:单位 转换器 | 更新日期: 2023-09-27 18:09:49

我计划实现代码,该代码将使用IValueConverter根据用户设置的布尔值以公制或英制显示度量单位。我面临的问题是,存储在我的数据库中的数据总是需要在度量。我首先使用实体框架数据库,如果这有区别。

所以我想知道的情况是这样的:如果用户选择以英制单位显示数据,但随后更改其中一个字段,并保存它-我如何确保它在公制中正确保存?从我在网上研究收集到的信息来看,这似乎是转换器的ConvertBack方法的一部分?现在我调用Textbox.GetBindingExpression(TextBox.TextProperty).UpdateSource();来保存数据,我不明白如何使它工作,因为,据我所知,它只是抓取TextBox中的值并保存它。我是对的,或者如果有一个ConvertBack方法会被调用以获得TextProperty吗?

也,一般来说,我去这是正确的方式(即使用IValueConverter来改变显示)?老实说,我对这个项目已经不知所措了,但我的截止日期很快就要到了,我迫切需要把这件事做好。如有任何帮助,我将不胜感激。

谢谢。

值转换器和公制/英制单位

那么您有一些模型,并且您想使用TextBoxValueConverter编辑该模型的一些属性。让我们取一个虚拟值转换器,它将value乘以10,在ConvertBack中将value除以10

public class MyConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value == null || value == DependencyProperty.UnsetValue)
            return null;
        return (decimal) value*10;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value == null || value == DependencyProperty.UnsetValue)
            return 0;
        decimal d;
        if (decimal.TryParse((string) value, out d))
            return d/10;
        return 0;
    }
}

现在一些测试模型

public class MyModel : INotifyPropertyChanged {
    private decimal _someValue;
    public decimal SomeValue
    {
        get { return _someValue; }
        set
        {
            if (value == _someValue) return;
            _someValue = value;
            OnPropertyChanged();
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
然后是文本框
<TextBox Width="150" Height="20" Text="{Binding SomeValue, Mode=TwoWay, Converter={StaticResource myConverter}, UpdateSourceTrigger=PropertyChanged}" />

如果您使用UpdateSourceTrigger=PropertyChanged,在每个用户编辑上,值将传递给您的ConvertBack方法,结果将分配给您的模型的SomeValue。

当用户按下保存按钮时,您只需使用您拥有的任何方法将您的模型保存到数据库。您不需要显式地更新模型的属性,因为它们已经是最新的了。您也可以使用UpdateSourceTrigger=LostFocus(默认值)。然后,当字段失去焦点时,模型中的属性将与它同步(再次通过ConvertBack)