private void Button_Click_UpdateSourceDownlink(object sender, RoutedEventArgs e) { MultiBindingExpression mbex = BindingOperations.GetMultiBindingExpression(SpinEdit_DirectChannel, SpinEdit.TextProperty); if (mbex != null) { mbex.UpdateSource(); } }
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(); } }
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); }
/// <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; }