处理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。

处理WPF MVVM中的错误

也许你可以从不同的角度来解决这个问题。。。首先阻止用户在TextBox中输入任何非数字字符怎么样?

您可以使用PreviewTextInputPreviewKeyDown事件来执行此操作。。。将处理程序附加到有问题的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}"