【发布时间】:2016-04-23 22:51:33
【问题描述】:
我最近开始使用 MVVM,偶然发现了一个似乎很多人都遇到过的问题。
基本上我的模型中有一个 double 类型的属性,它链接到我的 ViewModel 中的字符串属性,实现 INotifyPropertyChanged 接口,该接口绑定到文本框的 Text 属性,由此 UpdateSourceTrigger 设置为 PropertyChanged,但是,文本框不允许我输入小数位或减号,我也不能将文本框设置为空白而不会导致应用程序崩溃。
我彻底搜索了这个问题的解决方案,并找到了许多可能的解决方案,这些解决方案在某些方面有效,但给我留下了其他问题。最后,我使用了多种方法来解决这个问题:
我发现this 很有用,并通过放置:
public App()
{
System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
}
在 App.xaml.cs 中,我现在可以在我的文本框中插入小数位。但是我仍然不能使用“-”,也不能将文本框设置为空白。
为了解决这个问题,我做了两件事。在我的 XAML 中,我将以下 StringFormat 添加到我的数据绑定中。
<TextBox Text="{Binding StringLinkedToDouble, UpdateSourceTrigger=PropertyChanged, StringFormat=-N2}"/>
“N2”之前的“-”允许我输入减号,但除非我先输入数值,然后在数字开头输入“-”,否则代码会出错。为了解决这个问题,以及我无法将文本框设置为空白而不遇到错误这一事实,我在 ViewModel 中执行了此操作:
public StringLinkedToDouble
{
get { return _model.DoubleToBeLinked.ToString(); }
set
{
if ((value != "") && (value != "-"))
_model.DoubleToBeLinked = Convert.ToDouble(value);
RaisePropertyChanged("StringLinkedToDouble");
}
}
虽然这可能有效,但我是 MVVM 的新手,我发布这个的原因是因为这个解决方案看起来非常简单,几乎太简单了,我担心这可能不是 MVVM 的“好”?我有一半希望被告知这不公平哈!如果是这种情况,那么有人可以提出更好的选择吗?提前致谢! 另外,如果我做的其他事情不是正确的 MVVM,请告诉我:)
【问题讨论】:
-
将文本框绑定到视图模型上的字符串应该很简单。我认为您在“我的模型中的..double 与字符串属性相关联..”方面做错了什么