0

我正在使用 WPF MVVM 我的项目之一。我有一个绑定到对象列表的数据网格。

<DataGrid  ItemsSource="{Binding Path=ListOfValues}" Margin="5,38" 

在我的视图模型类中,我有一个 ListOfValues 的属性

public ObservableCollection<ClassA> ListOfValues
        {
            get { return listOfValues; }
            set
            {
                listOfValues= value;
                RaisePropertyChangedEvent("ListOfValues");
            }
        }

在我的 ClassA 中,我有三个属性。

public string Name { get; set; }
public long No { get; set; }        
public decimal Amount { get; set; }

在网格中,用户只能为 Amount 字段输入一个值。我想验证用户是否为该字段输入了有效的十进制值。

建议我一个可以捕捉到异常的地方。我尝试在窗口关闭时处理它。但是如果用户输入无效值,它不会保存在视图的数据上下文中。我还尝试在 ClassA 的设置器中验证它,它没有命中值的设置器。

4

2 回答 2

0

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

您可以使用PreviewTextInputandPreviewKeyDown事件来执行此操作... 将处理程序附加到有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" />
于 2013-08-29T08:28:10.833 回答
0

我强烈建议您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}" 
于 2013-08-28T11:48:03.377 回答