开发者

Data validation in wpf

in my code i've this:

class Data
{
    private int valore;
    public int Valore
    {
        get 
        {
            return valore;
        }
        set
        {
            if (value > 10 || value < 0)
            {
                throw new ArgumentException("Insert a value between 0 and 10");
            }                    
            valore = value;                
        }
    }
}

Then i've:

Data dati = new Data { Valore = 6 };

    public MainWindow()
    {
        Initialize开发者_开发百科Component();                      

        this.DataContext = dati;
    }

and in XAML i've:

<TextBox Height="23" Width="120" Text="{Binding Path=Valore, Mode=TwoWay, ValidatesOnExceptions=True}"

The problem is that when I insert a value greater than 10, I can't see the red border around the TextBox, but instead my application throws an un-handled exception.


MSDN WPF Validation

You are doing this incorrectly, the reason that your program is crashing from an unhandled exception is that you are throwing and unhandled exception.


For DataValidatation you need to do the following:

  1. Implement System.ComponentModel.IDataErrorInfo in your Data Class

  2. You need to add ValidationRule to your Binding


The Debugger seems to ignore the fact that the exception generated here in actually caught by the binding engine. When you start your program outside Visual Studio, you should get the desired behaviour.

To avoid having the debugger break on your validation, you could use

public int Valore
{
    get { //... }
    [System.Diagnostics.DebuggerStepThrough()]
    set { //... }
}

Or, better yet, do not use exceptions for data validation, but have a look at the IDataErrorInfo interface. After all, invalid user input is not exceptional, but the norm. =)


Use ValidationRules property on your text binding binding

 <TextBox>
<TextBox.Text>
    <Binding Path=Valore, Mode=TwoWay>
        <Binding.ValidationRules>
            <ExceptionValidationRule />
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

if you enter wrong value your text box border will get red


There are many ways to perform validation. If you're using MVVM then probably IDataErrorInfo is the way to go.

I would pair that with FluentValidation to simplify things.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜