Проверка WPF для целой формы

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

14
задан Ralph Willgoss 13 January 2014 в 04:43
поделиться

4 ответа

Приложение WPF должно отключить кнопку для представления эквивалентности формы, вводимые данные не допустимы. Можно достигнуть этого путем реализации интерфейс IDataErrorInfo на бизнес-объекте, использования Привязки с [1 112] ValidatesOnDataErrors =true. Для настройки вида человека управляет в случае ошибок, набор Validation.ErrorTemplate .

XAML:

<Window x:Class="Example.CustomerWindow" ...>
    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Save"
                        CanExecute="SaveCanExecute"
                        Executed="SaveExecuted" />
    </Window.CommandBindings>
    <StackPanel>
        <TextBox Text="{Binding FirstName, ValidatesOnDataErrors=true, UpdateSourceTrigger=PropertyChanged}" />
        <TextBox Text="{Binding LastName, ValidatesOnDataErrors=true, UpdateSourceTrigger=PropertyChanged}" />
        <Button Command="ApplicationCommands.Save" IsDefault="True">Save</Button>
        <TextBlock Text="{Binding Error}"/>
    </StackPanel>
</Window>

Это создает Window с два TextBox es, где можно отредактировать имя и фамилию клиента. Кнопка "Save" только включена, если никакие ошибки проверки не произошли. TextBlock под кнопкой показывает текущие ошибки, таким образом, пользователь знает то, что произошло.

значение по умолчанию ErrorTemplate является тонкой красной границей вокруг ошибочного Управления. Если это не вписывается в Вас визуальное понятие, смотрит Проверка в статье Windows Presentation Foundation о CodeProject для всестороннего взгляда в то, что может быть сделано об этом.

, Чтобы заставить окно на самом деле работать, должно быть немного инфраструктуры в Окне и Клиенте.

Код Позади

// The CustomerWindow class receives the Customer to display
// and manages the Save command
public class CustomerWindow : Window
{
    private Customer CurrentCustomer;
    public CustomerWindow(Customer c) 
    {
        // store the customer for the bindings
        DataContext = CurrentCustomer = c;
        InitializeComponent();
    }

    private void SaveCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = ValidationEngine.Validate(CurrentCustomer);
    }

    private void SaveExecuted(object sender, ExecutedRoutedEventArgs e) 
    {
        CurrentCustomer.Save();
    }
}

public class Customer : IDataErrorInfo, INotifyPropertyChanged
{
    // holds the actual value of FirstName
    private string FirstNameBackingStore;
    // the accessor for FirstName. Only accepts valid values.
    public string FirstName {
        get { return FirstNameBackingStore; }
        set {
            FirstNameBackingStore = value;
            ValidationEngine.Validate(this);
            OnPropertyChanged("FirstName");
        }
    }
    // similar for LastName        

    string IDataErrorInfo.Error {
        get { return String.Join("\n", BrokenRules.Values); }
    }

    string IDataErrorInfo.this[string columnName]
    {
        get { return BrokenRules[columnName]; }
    }
}

очевидное улучшение должно было бы переместиться IDataErrorInfo реализация иерархия классов, так как это только зависит от эти ValidationEngine, но не бизнес-объект.

, В то время как это - действительно больше кода, чем простой пример Вы, если, он также имеет вполне немного больше функциональности, чем только проверка законность. Это дает Вам мелкомодульные, и автоматически обновленные признаки пользователю о проблемах проверки и автоматически отключает кнопку "Save", пока пользователь пытается ввести недопустимые данные.

26
ответ дан 24 October 2019 в 05:06
поделиться

Я предложил бы посмотреть на интерфейс IDataErrorInfo на Вашем бизнес-объекте. Также взгляните на эту статью: Сам Проверяющий Текстовое поле

2
ответ дан 24 October 2019 в 05:06
поделиться

Описание Вашей проблемы немного неопределенно мне. Я имею в виду, я не абсолютно уверен, какова Ваша трудность. Предположение, что DataContext является своего рода предъявителем или контроллером, который имеет propetry, представление клиентского экземпляра и ValidateCommand является свойством типа ICommand:

  <StackPanel>  
    <TextBox Text="{Binding CurrentCustomer.FirstName}" />
    <TextBox Text="{Binding CurrentCustomer.LastName}" />
    <Button Content="Validate" 
            Command="{Binding ValidateCommand}"
            CommandParameter="{Binding CurrentCustomer}" />
    <ItemsControl ItemsSource="{Binding CurrentCustomer.BrokenRules}" />
  </StackPanel>

Этот XAML действительно упрощен, конечно, и существуют другие способы сделать это. Как Веб-разработчик, который теперь в большой степени связан с WPF, я нахожу большинство задач как это значительно легче в WPF.

0
ответ дан 24 October 2019 в 05:06
поделиться

Возможно, вас заинтересует пример приложения BookLibrary WPF Application Framework (WAF) . В нем показано, как использовать проверку в WPF и как управлять кнопкой «Сохранить» при наличии ошибок проверки.

1
ответ дан 24 October 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: