我最近一直在研究 MVVM Light 中的应用程序。我的 XAML 中的 TextBox 绑定到我的 UI 。我想验证任何输入并确保只输入数字。我尝试过以下代码:
我的 TextBox :
<TextBox TabIndex="1" Height="23" MinWidth="410" DockPanel.Dock="Left"
HorizontalAlignment="Left"
Text="{Binding Input, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{Binding IsEnabled}"
AcceptsReturn="False"
local:FocusExtension.IsFocused="{Binding IsFocused}">
在我的ViewModel中:
private string input;
public string Input
{
get { return this.input; }
set
{
decimal test;
if(decimal.TryParse(value, out test))
{
this.input = value;
}
else
{
this.input = "";
}
RaisePropertyChanged("Input");
}
}
无法更新 UI 。如果我输入“B”并检查调试器,它将通过setter运行,但无法实际更新 UI 。
奇怪的是,如果我在else块中设置this.input = "TEST";
,UI
会更新,但是,如果我尝试将其设置为“”,则为字符串。清空或验证前的输入值, UI 无法更新。
这是设计的吗?可能是一个错误?有什么我做错了吗?
修改我错误地忘记在我的示例代码中包含RaisePropertyChanged
。我已经更新了。提升它不是问题,因为我看到调试器一直运行通过提升它并通过getter返回输入。
答案 0 :(得分:0)
你使用字符串类型属性,然后转换为十进制,更容易改变这个:
public decimal Input
{
get { return this.input; }
set
{
this.input = value;
RaisePropertyChanged("Input");
}
}
对于验证使用IDataErrorInfo(阅读更多:http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx)
答案 1 :(得分:0)
我们所做的是创建了一个自定义控件,因为我们将它用于货币文本框。我警告你,我没有确认这是一个好主意,或者与MVVM模型一致,因为控件的所有操作都是在后面的代码中完成的。
在文本框的控件中,我们在PreviewTextInput上有一个事件来执行此操作
e.Handled = Functions.DoubleConverter(Convert.ToChar(e.Text), ((TextBox)sender).Text.Replace("$", ""));
然后对于这个功能(这不完美,我还有一些问题)是:
static public bool DoubleConverter(char c, string str)
{
if (!char.IsDigit(c))
{
if (c == '.' && (str.Contains('.')))
{
return true;
}
else if (c != '.')
{
return true;
}
}
return false;
}
请使用此作为参考,不完全是因为它是一个非常粗略的实现。