对具有相同 属性 名称的集合中的元素进行数据验证
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(...);
我想这是个奇怪的问题,因为我找不到任何相关信息。
我有一个名为 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(...);