假设我有10个TextBox,它们都有不同的值,但它们都是TextBoxes。而且,我有一个方法CheckInputValue(Textbox tb)
。现在,点击一个按钮,我希望该方法检查所有文本框并确定是否允许该值。
但我不想这样做:
void DoWork()
{
CheckInputValue(t1);
CheckInputValue(t2);
CheckInputValue(t3);
CheckInputValue(t4);
...
CheckInputValue(tx);
}
请注意:以上只是一个例子。
我有一个复杂的方法需要在几个相同类型的控件上执行,我有大约25个控件。这样做有更优雅的方式吗? 谢谢。
答案 0 :(得分:1)
如果列表中包含所有t
,则可以使用List<T>.ForEach
:
listWithT.ForEach(CheckInputValue);
或者使用常规foreach
foreach (T t in list)
{
CheckInputValue(t);
}
或创建内联数组:
foreach (T t in new T[] { t1, t2, t3 })
{
CheckInputValue(t);
}
如果没有,那就没有简单的方法了。
答案 1 :(得分:0)
你可以这样做:
List<TextBox> tbxList = new List<TextBox>()
{
t1,
t2,
t3,
t4
};
foreach (Textbox tbx in tbxList)
{
CheckInputValue(tbx);
}
答案 2 :(得分:0)
对不起,如果我有点过于苛刻,但还有更多 将控件添加到列表中的优雅方式,如i ++ 因为我的所有控件都被命名为i1,i2,i3 .... ix:S
你可以这样做(但它很脏):
int n_tbx = 5;
List<TextBox> tbxList = new List<TextBox>();
for (int i = 0; i < n_tbx; i++)
{
//Where "this" is your mainframe
tbxList.Add(this.Controls.Find("t"+i, true).FirstOrDefault() as TextBox);
}
foreach (Textbox tbx in tbxList)
{
CheckInputValue(tbx);
}
答案 3 :(得分:0)
我想我已经知道如何让它变得更容易一些,并且采用更多的MVVM方式。它被简化了 - 没有属性更改报告,输入属性和东西..只是为了让你明白这一点。 因此,主要思想是您可以使用某种属性(在这种情况下为ValidateAttribute)标记应该验证的所有属性,并使用单个Validate方法,您可以收集所有属性并在一个位置验证它。
class SampleViewModel
{
[Validate]
public string SomeProperty { get; set; }
[Validate]
public string AnotherProperty { get; set; }
public void Validate()
{
foreach (var propertyInfo in GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.IsDefined(typeof(ValidateAttribute), true)))
{
var value = propertyInfo.GetValue(this, null);
Validate(value as string);
}
}
private void Validate(string value)
{
if (string.IsNullOrEmpty(value))
{
// do something with the invalid input, i.e. throw the exception
}
}
}
class ValidateAttribute : Attribute
{
}
答案 4 :(得分:0)
我希望以前面的答案为基础,让您让代码为您完成工作,这样您就可以调用单个方法并获得所需的结果:
您可以从文本框继承并添加一些具有文本框所有特征的功能,但也会将自身添加到跟踪所有这些对象的单个列表中:
public class CustomTextBox :TextBox
{
private static List<CustomTextBox> CustomTextBoxList = new List<CustomTextBox>();
public static async void ValidateAll()
{
foreach (CustomTextBox MyCustomTextBox in CustomTextBoxList)
{
****PERFORM VALIDATION****
}
}
public CustomTextBox ()
{
CustomTextBoxList.Add(this);
}
~CustomTextBox()
{
CustomTextBoxList.Remove(this);
}
}
将这些添加到您的XAML页面非常容易(抱歉,我不确定如何将XAML添加到这些答案中):
Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
StackPanel
local:CustomTextBox Text="A" Width="150" Margin="10"/
local:CustomTextBox Text="B" Width="150" Margin="10"/
local:CustomTextBox Text="C" Width="150" Margin="10"/
local:CustomTextBox Text="D" Width="150" Margin="10"/
local:CustomTextBox Text="E" Width="150" Margin="10"/
Button Content="Validate TextBoxes!" Click="Button_Click"/
/StackPanel
/Grid
单击该按钮时,它会调用一个函数,该函数将同时对所有这些函数执行验证:
private void Button_Click(object sender, RoutedEventArgs e)
{
CustomTextBox.ValidateAll();
}