Проверка теряется при смене вкладки [дубликат]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Проверка теряется при смене вкладки [дубликат]

Сообщение Anonymous »

Я использую элемент управления вкладками для группировки различных полей ввода, например текстовых полей. Я проверяю ввод пользователя в этих текстовых полях через IDataErrorInfo в моей модели представления.
Теперь, когда ввод пользователя недействителен, и я меняю страницы вкладок вперед и назад. индикатор проверки исчезает из текстового поля.
Я нашел возможное решение: проверка должна выполняться принудительно при смене вкладки. Каким-то образом это работает, потому что логика проверки в виртуальной машине выполняется, но визуального индикатора в текстовом поле все еще нет.
Я уже пробовал обновить источник и цель привязки и поместить обновите логику в блок Dispatcher.BeginInvoke с фоновым приоритетом, чтобы дать пользовательскому интерфейсу возможность полностью отрисоваться. Но ничего из этого не помогло. Есть ли у кого-нибудь идеи, какую часть я упускаю?
Мой код выглядит следующим образом:
разметка xaml











код
private static IEnumerable FindVisualChildren(object obj)
{
// traverses the visual tree recursively and returns all visual children of obj
}

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!(e.Source is TabControl tabControl))
{
return;
}

foreach (TabItem tab in tabControl.Items)
{
if (!tab.IsSelected)
{
continue;
}

// Re-validate the controls within the selected tab
foreach (var child in FindVisualChildren(tab.Content))
{
if (child is TextBox textBox)
{
var binding = textBox.GetBindingExpression(TextBox.TextProperty);
binding?.UpdateSource();
}
}
}
}

Решение
Несмотря на то, что решение, упомянутое в проверке WPF, перестает работать при смене вкладок, добавление пользовательского стиля неприменимо в моем случае использования.
Но есть более удобное решение:
Очистка результатов проверки привязки заставляет wpf Glue-логику повторно проверять вводимые пользователем данные. Это вернет маркеры проверки обратно в элемент управления:
Реализуйте прикрепленное свойство ниже
public static class RevalidateOnTabChangeBehavior
{
public static readonly DependencyProperty RevalidateOnTabChangeProperty =
DependencyProperty.RegisterAttached(
"RevalidateOnTabChange",
typeof(bool),
typeof(RevalidateOnTabChangeBehavior),
new UIPropertyMetadata(false, OnRevalidateOnTabChangePropertyChanged));

public static bool GetRevalidateOnTabChange(DependencyObject obj)
{
return (bool)obj.GetValue(RevalidateOnTabChangeProperty);
}

public static void SetRevalidateOnTabChange(DependencyObject obj, bool revalidateOnTabChange)
{
obj.SetValue(RevalidateOnTabChangeProperty, revalidateOnTabChange);
}

private static void OnRevalidateOnTabChangePropertyChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (!(d is TabControl tabControl))
{
return;
}

if ((bool)e.NewValue)
{
tabControl.SelectionChanged += OnTabControlSelectionChanged;
}
else
{
tabControl.SelectionChanged -= OnTabControlSelectionChanged;
}
}

private static void OnTabControlSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!(e.Source is TabControl tabControl))
{
return;
}

foreach (TabItem tab in tabControl.Items)
{
if (!tab.IsSelected)
{
continue;
}

// Re-validate the controls within the selected tab
foreach (var child in FindVisualChildren(tab.Content))
{
if (!(child is TextBox textBox))
{
continue;
}

var binding = textBox.GetBindingExpression(TextBox.TextProperty);
if (binding == null)
{
continue;
}

Validation.ClearInvalid(binding);
binding.UpdateSource();
}
}
}

private static IEnumerable FindVisualChildren(object parent)
{
if (!(parent is DependencyObject dependencyObject))
{
yield break;
}

for (var i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
{
var child = VisualTreeHelper.GetChild(dependencyObject, i);

yield return child;

foreach (var childOfChild in FindVisualChildren(child))
{
yield return childOfChild;
}
}
}
}

И добавьте этот фрагмент в xaml элемента управления Tab:


...


Подробнее здесь: https://stackoverflow.com/questions/787 ... tab-change
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Внутренний фрейм Tkinter не обновляется при смене вкладки
    Гость » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Гость
  • Содержимое вкладки формы Laravel Filament v3 теряется
    Anonymous » » в форуме Php
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Проверка WPF перестает работать при смене вкладок
    Anonymous » » в форуме C#
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Вкладки Bootstrap – изменение вкладки при нажатии кнопки «Назад»
    Anonymous » » в форуме Jquery
    0 Ответы
    180 Просмотры
    Последнее сообщение Anonymous
  • Как получить текст для каждой вкладки и индекс выбранной вкладки из метода PaintTab() BasicTabbedPaneUI?
    Anonymous » » в форуме JAVA
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»