我计划实现代码,该代码将使用IValueConverter根据用户设置的布尔值以公制或英制显示测量单位。我面临的问题是存储在我的数据库中的数据必须始终是公制的。如果这有所不同,我首先使用Entity Framework数据库。
所以我想知道的情况是:如果用户选择以英制单位显示数据,然后更改其中一个字段并保存 - 我如何确保以公制方式正确保存?从我通过在线研究收集到的内容来看,这似乎是转换器的ConvertBack方法的一部分?现在我调用Textbox.GetBindingExpression(TextBox.TextProperty).UpdateSource();保存数据,我不明白如何使这项工作,因为据我所知,它只是抓住TextBox中的值并保存它。我是对的,或者是否有一个ConvertBack方法会被调用以获得TextProperty?
另外,一般来说,我是否采用正确的方法(即使用IValueConverter改变显示)?说实话,我在这个项目上已经超出了我的想法,但我已经快速接近了最后期限,并且迫切需要做到这一点。任何帮助将不胜感激。
感谢。
答案 0 :(得分:1)
所以你有一些模型,并且你想使用TextBox
和ValueConverter
编辑该模型的一些属性。让我们采用一些虚拟值转换器,将值乘以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
)