Базовая проверка WPF - PullRequest
       0

Базовая проверка WPF

2 голосов
/ 12 января 2012

Я только начинаю с WPF и особенно проверяю записи в TextBox.

Это мой XAML: -

<Window x:Class="WpfTestBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" 
        Height="350" 
        Width="525"
        Loaded="OnInit">
    <Grid>
        <Button Content="OK" Height="23" HorizontalAlignment="Left" Margin="235,164,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="206,108,0,0"                  
                 Name="textBox1" VerticalAlignment="Top" Width="120" >
            <TextBox.Text>
                <Binding Path="Description" UpdateSourceTrigger="LostFocus" >
                    <Binding.ValidationRules>
                        <ExceptionValidationRule />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
    </Grid>
</Window>

Это мой обязательный код: -

namespace WpfTestBinding
{
    class MyDataItem
    {
        private String _description;
        public String Description
        {
            get { return _description; }
            set
            {
                _description = value;

                Debug.WriteLine("Setting description ="+value);

                if (String.IsNullOrEmpty( value ))
                {
                    throw new ApplicationException("Description is mandatory.");
                }                                
            }
        }
    }
}

и это мой код поддержки: -

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;

    namespace WpfTestBinding
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void OnInit(object sender, RoutedEventArgs e)
            {
                this.DataContext = new MyDataItem();
            }

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                Debug.WriteLine("Button clicked.");
            }
        }
    }

Во-первых, если я выберу текстовое поле и из него ничего не выйдет, я бы ожидал, что будет выдано исключение «Описание обязательно»? Если я затем ввожу что-то в текстовое поле и сразу же удаляю это, то нажимаю вкладку, исключение выбрасывается ?? Это исключение затем обрабатывается, и я получаю ошибку необработанного исключения.

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Во-первых, вы не проверяете с помощью исключений. Исключения предназначены для указания того, что в потоке программы произошло что-то исключительное, и для выдачи ошибки.

См. Проверка данных в 3.5 для ясного объяснения того, как работает проверка WPF

Во-вторых, причина, по которой вы не видите его, когда просто вводите и покидаете TextBox, заключается в том, что вы фактически не обновляете значение для свойства привязки.Когда вы вводите значение, а затем удаляете его, вы обновляете это значение.

1 голос
/ 18 января 2012

После долгих копаний в сети и прочтения документации MS я нашел то, что хотел.Что вы можете сделать, это установить атрибут 'LostKeyboardFocus', чтобы он указывал на какой-то собственный метод, например, здесь, когда текстовое поле теряет фокус, вызывается метод 'TextBoxLostKeyboardFocus ()'.

  <TextBox Height="23" HorizontalAlignment="Left" Margin="206,108,0,0"                  
           Name="textBox1" 
           LostKeyboardFocus="TextBoxLostKeyboardFocus" 
           VerticalAlignment="Top" Width="120" >
      <TextBox.Text>
          <Binding Path="Description" 
                         UpdateSourceTrigger="LostFocus" 
                         ValidatesOnDataErrors="True" 
                         NotifyOnSourceUpdated="True"                         
                         Mode="TwoWay">
           </Binding>
      </TextBox.Text>
  </TextBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...