IValueConverter和公制/英制单位

时间:2016-10-02 14:00:42

标签: c# wpf entity-framework units-of-measurement

我计划实现代码,该代码将使用IValueConverter根据用户设置的布尔值以公制或英制显示测量单位。我面临的问题是存储在我的数据库中的数据必须始终是公制的。如果这有所不同,我首先使用Entity Framework数据库。

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

另外,一般来说,我是否采用正确的方法(即使用IValueConverter改变显示)?说实话,我在这个项目上已经超出了我的想法,但我已经快速接近了最后期限,并且迫切需要做到这一点。任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:1)

所以你有一些模型,并且你想使用TextBoxValueConverter编辑该模型的一些属性。让我们采用一些虚拟值转换器,将值乘以10,并在ConvertBack中将值除以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(默认值为1)。然后每当字段失去焦点时 - 模型中的属性将与其同步(再次,通过ConvertBack