处理WPF MVVM中的错误
本文关键字:错误 MVVM WPF 处理 | 更新日期: 2023-09-27 18:29:29
我在我的一个项目中使用WPF MVVM。我有一个数据网格,我将它绑定到对象列表。
<DataGrid ItemsSource="{Binding Path=ListOfValues}" Margin="5,38"
在我的视图模型类中,我有一个ListOfValues 的属性
public ObservableCollection<ClassA> ListOfValues
{
get { return listOfValues; }
set
{
listOfValues= value;
RaisePropertyChangedEvent("ListOfValues");
}
}
在我的A级中,我有三个属性。
public string Name { get; set; }
public long No { get; set; }
public decimal Amount { get; set; }
在网格中,用户只能为"金额"字段输入一个值。我想验证用户是否为该文件输入了有效的十进制值。
给我推荐一个可以抓到高管的地方。我试着在窗户关上的时候处理它。但是,如果用户输入的值无效,则不会保存在视图的数据上下文中。我还试图在ClassA的setter中验证它,它没有命中值的setter。
也许你可以从不同的角度来解决这个问题。。。首先阻止用户在TextBox
中输入任何非数字字符怎么样?
您可以使用PreviewTextInput
和PreviewKeyDown
事件来执行此操作。。。将处理程序附加到有问题的TextBox
,并将以下代码添加到其中:
public void TextCompositionEventHandler(object sender, TextCompositionEventArgs e)
{
// if the last pressed key is not a number or a full stop, ignore it
return e.Handled = !e.Text.All(c => Char.IsNumber(c) || c == '.');
}
public void PreviewKeyDownEventHandler(object sender, KeyEventArgs e)
{
// if the last pressed key is a space, ignore it
return e.Handled = e.Key == Key.Space;
}
如果你想花点时间重新使用,你可以把它放在Attached Property
。。。能够在属性中添加此功能真是太棒了
<TextBox Text="{Binding Price}" Attached:TextBoxProperties.IsDecimalOnly="True" />
我强烈建议您在数据类型类中实现IDataErrorInfo
接口。你可以在这里找到一个完整的教程,但从根本上讲,这就是它的工作原理。
我们需要为每个类添加一个indexer
:
public string this[string columnName]
{
get
{
string result = null;
if (columnName == "FirstName")
{
if (string.IsNullOrEmpty(FirstName))
result = "Please enter a First Name";
}
if (columnName == "LastName")
{
if (string.IsNullOrEmpty(LastName))
result = "Please enter a Last Name";
}
return result;
}
}
取自链接教程
在这个indexer
中,我们依次添加了每个属性的验证要求。您可以为每个属性添加多个要求:
if (columnName == "FirstName")
{
if (string.IsNullOrEmpty(FirstName)) result = "Please enter a First Name";
else if (FirstName.Length < 3) result = "That name is too short my friend";
}
无论您在result
参数中返回什么,都将用作UI中的错误消息。为了实现这一点,您需要在binding
值中添加
Text="{Binding FirstName, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"