WPF Binding: отключить TextBoxes + Validation и DataContext Issue - PullRequest
0 голосов
/ 13 июня 2018

У моей простой программы есть два окна:

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

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

Это фрагмент моего XAML, содержащий один из текстовых полей (на данный момент единственный, который я связал):

<TextBox x:Name="tbSlave1" Validation.Error="ValidationError" IsEnabled="{Binding TextBoxEnabled}" Text="{Binding UpdateSourceTrigger=PropertyChanged, Path=SlavePoint1Name, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>

Пока это мой второй класс окон:

public partial class GeneratorWindow : Window, INotifyPropertyChanged
{
    private readonly Validator validator = new Validator();

    private int noOfErrorsOnScreen;

    public GeneratorWindow()
    {
        this.InitializeComponent();
        this.grid.DataContext = this.validator;
    }

    public int NumberOfPoints { private get; set; }

    public int MainPDC { private get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private Boolean IsEnabled;
    public Boolean TextBoxEnabled
    {
        get { return IsEnabled; }

        set
        {
            IsEnabled = value;
            NotifyPropertyChanged("TextBoxEnabled");
        }
    }

    private void ValidationError(object sender, ValidationErrorEventArgs eventArgs)
    {
        if (eventArgs.Action == ValidationErrorEventAction.Added)
        {
            this.noOfErrorsOnScreen++;
        }
        else
        {
            this.noOfErrorsOnScreen--;
        }
    }

    private void ValidationCanBeExecuted(object sender, CanExecuteRoutedEventArgs eventArgs)
    {
        eventArgs.CanExecute = this.noOfErrorsOnScreen == 0;
        eventArgs.Handled = true;
    }

    private void ValidationExecuted(object sender, ExecutedRoutedEventArgs eventArgs)
    {
        // If the validation was successful, let's generate the files.
        this.Close();

        eventArgs.Handled = true;
    }
}

На данный момент я возвращаюсь к тому, что мое окно отключено (не может выбрать любой TextBox) и, очевидно, это:

System.Windows.Data Error: 40: Ошибка пути BindingExpression: свойство 'TextBoxEnabled' не найдено в 'объекте' '' Validator '(HashCode = 14499481)'.BindingExpression: Path = TextBoxEnabled;DataItem = 'Validator' (HashCode = 14499481);Целевым элементом является TextBox (Name = 'tbSlave1');Свойство target - IsEnabled (тип Boolean)

Из того, что я могу понять, виновником является способ управления DataContext в конструкторе моего класса.Возможно, мне нужно что-то добавить в строку валидатора или полностью изменить его, но я не понимаю, как.

1 Ответ

0 голосов
/ 13 июня 2018

Я думаю, что все будет в порядке, если вы установите DataContext на GeneratorWindow и соответственно обновите свои привязки.Чтобы это работало, вам нужно изменить Validator на публичное свойство.

Измененное определение валидатора:

public Validator Validator { get; } = new Validator();

DataContext:

this.grid.DataContext = this;

Обновлена ​​привязка:

<TextBox x:Name="tbSlave1" 
         Validation.Error="ValidationError" 
         IsEnabled="{Binding TextBoxEnabled}" 
         Text="{Binding UpdateSourceTrigger=PropertyChanged, 
                        Path=Validator.SlavePoint1Name, 
                        ValidatesOnDataErrors=true, 
                        NotifyOnValidationError=true}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...