Enterprise Library 5.0 w / WPF. Первый элемент не проверяется при загрузке в коллекции с DataTemplate

#wpf #validation #enterprise-library

#wpf #проверка #enterprise-library

Вопрос:

Я пользуюсь этим форумом довольно долго и, наконец, обнаружил проблему, на которую раньше не было ответа, поэтому это моя первая тема здесь.

В любом случае, я создал небольшую программу для проверки диспетчера проверки в Enterprise Library 5.0 и обнаружил в ней ошибку (?) При ее использовании в коллекциях с DataTemplate, Чтобы увидеть указанный тип.

Проблема в том, что первый объект загружается без красного квадрата (что означает, что он действителен), когда на самом деле это не так. только после его небольшого изменения он получает красный квадрат (то есть после добавления буквы или ее удаления). Все остальные объекты в коллекции отлично работают во время загрузки, только первый действует по-другому.

Есть какие-нибудь подсказки?


Window.xaml.cs:

  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Collection = new ObservableCollection<NewClass>();

            for (int i = 1; i < 6; i  )
            {
                Collection.Add(new NewClass()
                {
                    ID = i,
                    Name = "Example"   i
                });

            }

            this.stackPanel.DataContext = this;
            this.listBox.ItemsSource = Collection;

        }

        public ObservableCollection<NewClass> Collection;
 

NewClass

  public class NewClass
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
 

Window.xaml

  <Window.Resources>
        <DataTemplate DataType="{x:Type local:NewClass}">
            <StackPanel Orientation="Horizontal">
                <TextBox Margin="10,10,10,10" vab:Validate.BindingForProperty="Text" vab:Validate.ValidatesOnTargetUpdated="True" 
                Text="{Binding Name, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}" />
            </StackPanel>

        </DataTemplate>
    </Window.Resources>


<StackPanel Orientation="Vertical" x:Name="stackPanel">
    <ListBox Margin="10,0,0,0" x:Name="listBox"  />
</StackPanel>
 

App.config

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="validation" type="Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.ValidationSettings, Microsoft.Practices.EnterpriseLibrary.Validation, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
  </configSections>

  <validation>
    <type name="EntLibTest.NewClass" defaultRuleset="ValidationRuleset"
  assemblyName="EntLibTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
      <ruleset name="ValidationRuleset">
        <properties>
          <property name="Name">
            <validator type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.StringLengthValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          upperBound="3" lowerBoundType="Inclusive" negated="false" name="String Length Validator" />
          </property>
        </properties>
      </ruleset>
    </type>
  </validation>
</configuration>
 

Ответ №1:

Я предполагаю, что это потому, что вы проверяете, когда цель обновляется, а не при ее первой загрузке

Лучший способ выполнить проверку в WPF — это реализовать свой класс IDataErrorInfo и поместить туда свою логику проверки.

Комментарии:

1. Это действительно происходит, когда я проверяю — когда целевой объект обновляется. Для простых правил проверки я хотел бы использовать внешний файл конфигурации без какого-либо участия кода. Для сложных правил проверки мне придется использовать интерфейс и структуру IDataErrorInfo. Есть ли какой-либо способ получить цель, проверенную при загрузке или обновленную каким-либо образом, чтобы исправить эту проблему? Я пробовал обновлять привязку, но это не сработало.