Принудительная проверка столбца DataGrid (WPF) - PullRequest
7 голосов
/ 04 ноября 2010

Я хотел бы знать, как программно запустить проверку достоверности через DataGridColumn.Это было бы почти так же, как при вызове метода UpdateSource метода BindingExpression, но я не могу получить BindingExpression столбца.

Спасибо.

PS: установка ValidatesOnTargetUpdatedсвойство на ValidationRule - это не то, что я ищу :)

Ответы [ 3 ]

1 голос
/ 25 июля 2011

@ user424096

У меня нет доступа к среде Visual Studio, но следующий псевдокод может помочь вам выбрать нужный путь ...

  1. Создайте присоединенное логическое свойство с именем NotifySourceUpdates и прикрепите его к DataGridCell ... Я прикрепил его на уровне сетки данных, чтобы он применялся ко всем ячейкам сетки данных ... вы также можете прикрепить его на уровне столбца. ..

            <DataGrid ItemsSource="{Binding}">
                    <DataGrid.CellStyle>
                            <Style TargetType="DataGridCell" >
                                    <Setter Property="ns:MyAttachedBehavior.NotifySourceUpdates" Value="True"/>
                            </Style>
                    </DataGrid.CellStyle>
            </DataGrid>
    
  2. Это присоединенное поведение будет обрабатывать вложенное событие Binding.SourceUpdated на уровне ячейки. Поэтому всякий раз, когда любая привязка как часть обычного или редактируемого режима любого дочернего элемента пользовательского интерфейса обновляет свой источник, она срабатывает и всплывает до уровня ячейки.

            public static readonly DependencyProperty NotifySourceUpdatesProperty
            = DependencyProperty.RegisterAttached(
              "NotifySourceUpdates",
              typeof(bool),
              typeof(MyAttachedBehavior),
              new FrameworkPropertyMetadata(false, OnNotifySourceUpdates)
            );
    
            public static void SetNotifySourceUpdates(UIElement element, bool value)
            {
                element.SetValue(NotifySourceUpdatesProperty, value);
            }
    
            public static Boolean GetNotifySourceUpdates(UIElement element)
            {
                return (bool)element.GetValue(NotifySourceUpdatesProperty);
            }
    
            private static void OnNotifySourceUpdates(DependencyObject d, DependencyPropertyEventArgs e)
            {
                if ((bool)e.NewValue)
                {
                    ((DataGridCell)d).AddHandler(Binding.SourceUpdated, OnSourceUpdatedHandler);
                }
            }
    
  3. В этом обработчике события аргументы имеют тип DataTransferEventArgs, который дает вам объект TargetObject. Это будет ваш контроль, который необходимо проверить.

    private static void OnSourceUpdatedHandler(object obj, DataTransferEventArgs e) //// Please double check this signature
    {
        var uiElement = e.TargetObject as UIElement;
        if (uiElement != null)
        {
            ///... your code to validated uiElement.                        
        }
    }
    
  4. Здесь вы должны знать, какое значение, представленное элементом управления, является действительным или недействительным.

    (uiElement.MyValue == null) //// Invalid!!
    
  5. Если вы хотите, чтобы привязка элемента управления стала недействительной, просто используйте вызов MarkInvalid, выполнив следующие действия ...

    ValidationError validationError = 
            new ValidationError(myValidationRule, 
            uiElement.GetBindingExpression(UIElement.MyValueDependecyProperty));
    
    validationError.ErrorContent = "Value is empty!";
    
    Validation.MarkInvalid(uiElement.GetBindingExpression(UIElement.MyValueDependencyProperty), validationError);
    

Дайте мне знать, если это работает ...

1 голос
/ 22 июня 2011

В .NET Framework 4 пространство имен с именем System.ComponentModel.DataAnnotations доступно как для обычной CLR (WPF), так и для более легкой CLR Silverlight.Вы можете использовать пространство имен DataAnnotations для различных целей.Один из них предназначен для проверки данных с использованием атрибутов, а другой - для визуального описания полей, свойств и методов или для настройки типа данных конкретного свойства.Эти три категории классифицируются в .NET Framework как атрибуты проверки, атрибуты отображения и атрибуты моделирования данных.В этом разделе используются атрибуты проверки для определения правил проверки объектов

http://www.codeproject.com/KB/dotnet/ValidationDotnetFramework.aspx

0 голосов
/ 31 июля 2011

Возможно, вы захотите внедрить System.ComponentModel.IDataErrorInfo , чтобы обеспечить проверку таких входных данных.

...