Я использую элемент управления вкладками для группировки различных полей ввода, например текстовых полей. Я проверяю ввод пользователя в этих текстовых полях через 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
Проверка теряется при смене вкладки [дубликат] ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение