对具有相同 属性 名称的集合中的元素进行数据验证

Data Validation on elements in a collection with same property names

我想这是个奇怪的问题,因为我找不到任何相关信息。

我有一个名为 TextBoxes 的 class,具有多个属性,如下所示:

public class TextBoxes
{
    public string Tag{ get; set; }
    public string Text {get; set; }
}

在我的视图模型中,我将其中一些添加到集合中:

...
List<TextBoxes> Controls = new List<TextBoxes>;
...

foreach (var item in somelist)
{
      Controls.Add(new TextBoxes(){ Tag=item.tag, Text=""});
      ...
}

最后,在我的视图中,我使用 DataTemplate 将所有这些控件添加到我的 UserControl:

<DataTemplate DataType="{x:Type clases:TextBoxes}">
        <StackPanel Orientation="Horizontal" Margin="10"  HorizontalAlignment="Stretch">
            <Label Content="{Binding Tag}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" MinWidth="50" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0">
            </TextBox>
        </StackPanel>
</DataTemplate>

 ...

 <ItemsControl ItemsSource="{Binding Controls}">
          <ItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                    <WrapPanel/>
              </ItemsPanelTemplate>
         </ItemsControl.ItemsPanel>
  </ItemsControl>

到目前为止一切顺利,这段代码显示了一堆带有标签的文本框,这里没问题。

问题是当我尝试向每个对象的 属性 Text 添加验证时。由于 属性 名称在每个规则中都是相同的,因此当我验证规则并尝试获取错误消息时,这包含所有规则的错误,因此我无法显示每个规则的具体一个。

我使用 helper 来验证数据。我将展示如何定义规则的示例:

foreach (var item in somelist)
{
      Validator.AddRule(() => item.Text, (
                  () => RuleResult.Assert(int.TryParse(item.Text, out o), "Error in " + item.Tag)));

如您所见,在规则中我将 属性 设置为 item.Text。由于此名称对所有这些名称都是相同的,因此在显示每个 TextBox 的错误时会显示所有这些错误。

我希望我说清楚了,任何人都可以在这里发表任何看法。

每个 TextBoxes 对象都应该有自己的 Validator。然后,您将为每个项目调用 AddRule

foreach (var item in somelist)
    item.Validator.AddRule(...);