Esempio n. 1
0
        private void Button_Click_UpdateSourceDownlink(object sender, RoutedEventArgs e)
        {
            MultiBindingExpression mbex = BindingOperations.GetMultiBindingExpression(SpinEdit_DirectChannel, SpinEdit.TextProperty);

            if (mbex != null)
            {
                mbex.UpdateSource();
            }
        }
Esempio n. 2
0
        private void Binding_TargetUpdated(object sender, DataTransferEventArgs e)
        {
            string txt = TestTextBox.Text;

            mbindingExpression =
                BindingOperations.GetMultiBindingExpression(e.TargetObject, e.Property);
            mbindingExpression.UpdateSource();

            foreach (var bind in mbindingExpression.BindingExpressions)
            {
                bind.UpdateSource();
            }
        }
Esempio n. 3
0
        public bool Validate(object rootElement)
        {
            if (!(rootElement is UIElement))
            {
                return(false);
            }

            bool result = true; // initially no validation errors

            var textBoxes = GetVisualChilds <TextBox>(rootElement as UIElement);

            foreach (var t in textBoxes)
            {
                BindingExpression expression = t.GetBindingExpression(TextBox.TextProperty);
                if (expression != null)
                {
                    expression.UpdateSource();
                    result &= !Validation.GetHasError(t);
                }
                else
                {
                    MultiBindingExpression multiExpression =
                        BindingOperations.GetMultiBindingExpression(t, TextBox.TextProperty);

                    if (multiExpression != null)
                    {
                        multiExpression.UpdateSource();
                        result &= !Validation.GetHasError(t);
                    }
                }
            }

            var comboBoxes = GetVisualChilds <ComboBox>(rootElement as UIElement);

            foreach (var c in comboBoxes)
            {
                BindingExpression expression = c.GetBindingExpression(ComboBox.SelectedItemProperty);
                if (expression != null)
                {
                    expression.UpdateSource();
                    result &= !Validation.GetHasError(c);
                }
            }

            return(result);
        }
Esempio n. 4
0
        /// <summary>Метод-прослушка изменения текста в <see cref="TextBox"/> в котором была создана привязка <see cref="BindToNumericExtension"/>.</summary>
        /// <param name="sender"><see cref="TextBox"/> в котором изменился текст.</param>
        /// <param name="e">Параметры события. Не используются.</param>
        private void TextBoxTextChanged(object sender, TextChangedEventArgs e)
        {
            // Извлечение TetxBox и привязки его свойства Text
            TextBox textBox = (TextBox)sender;
            MultiBindingExpression multiBindingExpression = BindingOperations.GetMultiBindingExpression(textBox, TextBox.TextProperty);

            // Если привязка - это не PrivateMulti, то отключается прослушка и выход из метода.
            if (!(multiBindingExpression?.ParentMultiBinding is PrivateMulti bindPriv))
            {
                textBox.TextChanged -= TextBoxTextChanged;
                // Очистка приисоединённого свойства.
                ClearTextBindingState(textBox);
                return;
            }

            // Получение состояния привязки
            TextBoxBindingState bindingState = GetBindingState(textBox);

            // Сохранить новый текст и параметры изменения
            UpdateTextBindingState(textBox, e.Changes);

            // Если изменение произошло по привязке - выйти из метода
            if (bindingState.TextChangeSource == PropertyChangeSourceEnum.Binding)
            {
                // Сброс состояния обновления по привязке.
                bindingState.TextChangeSource = PropertyChangeSourceEnum.NotBinding;

                return;
            }

            // Создание триггера обновления источника и обновления источника в нём,
            // запоминание состояния триггера
            bool triggerHasUpdated;

            using (var trigger = new SourceUpdateTrigger(textBox, TextBox.TextProperty))
            {
                // Обновление источника с флагом обновления из метода UpdateSource().
                bindingState.UpdateSourceState = UpdateSourceStateEnum.Called;
                multiBindingExpression.UpdateSource();

                // Запоминание состояния триггера.
                triggerHasUpdated = trigger.HasUpdated;
            }

            // Получение привязки к источнику.
            BindingExpressionBase bindingSource = multiBindingExpression.BindingExpressions[0];

            // Проверка триггера обновления источника
            if (triggerHasUpdated)
            {
                // Вызов обновления привязки к источнику для передачи нового значения.
                //bindingSource.UpdateSource();
            }
            // Если обновления не было - значит была ошибка конвертера
            // Для режима ввода "Только числа" надо вызвать ковертер.
            else if (!triggerHasUpdated && bindPriv.IsNumericOnly)
            {
                // Установка флага отменённого обновления.
                bindingState.UpdateSourceState = UpdateSourceStateEnum.CallCanceled;

                // Вызов обновления привязки от источника для обработки причины прерывания обновления.
                bindingSource.UpdateTarget();
            }

            // Сброс флага обновления из метода UpdateSource().
            bindingState.UpdateSourceState = UpdateSourceStateEnum.NotCalled;
        }