I have an WPF form with 3 textbox named FirstName LastName and GPA, and i want to check their content before inserting into the database. But i am trying to do this in another class. How can i make to access the textbox control from my class? the WPF window is named AddStudent and the class i want to make the check is named Consiste. I made Consiste static so i can use it on my AddStudent without creating an instance.
3 回答
在你的 Util 类中,你必须只有带有输入参数的方法
public static bool Validate(string firstName, string lastName,string gPA)
{
if(firstName.Length < 1)
.....
return true;
}
并调用这个静态类 Util
Util.Validate(FirstName.Content, LastName.Content, GPA.Content);
一般来说,将 UI 元素传递到后端代码(甚至是 UI 项目中的助手)并不是一个好主意。
大概 AddStudent 表单正在调用 Consiste 类的方法。您的方法调用应该将值传递给 Consiste 类,而不是让 Consiste 类返回表单以获取文本框。
如果您遵循模型-视图-视图模型设计模式,这是推荐的,因为这是 WPF 设计的一个,那么一般方法是这样的:
首先,创建一个 ViewModel 类作为数据的实际存储。(ViewModel 可能应该实现INotifyPropertyChanged,但为了简洁起见,我将在此处跳过它。)
public class MyFormViewModel
{
public string FirstName {get; set;}
public string LastName {get; set;}
public float GPA {get; set}
}
此类的属性是公开的,因此它们在任何地方都可见。
然后,创建一个表单并使用绑定将其字段连接到您的属性:
<Window x:Class="MyNamespace.MyForm">
<StackPanel>
<TextBox Text={Binding FirstName}/>
<TextBox Text={Binding LastName}/>
<TextBox Text={Binding Gpa}/>
</StackPanel>
</Window>
最后,当您实例化表单时,创建一个新的 ViewModel 用作表单的 DataContext:
var myFormContext = new MyFormViewModel();
var dialog = new MyForm { DataContext = myFormContext };
进行这种额外工作而不是直接针对 UI 进行编码的原因是,它有助于使您的代码更有条理。在接下来的道路上,使用多个视图重用相同的 ViewModel 类或重新排列用户界面更容易,而无需在所有代码中创建这样的级联更改。因此,从长远来看,遵循 MVVM 模式是一个非常好的习惯,可以立即养成。
作为一个具体示例,如果以这种方式构建代码会更容易,WPF 中已经有一个数据验证机制可以与 MVVM 代码一起使用:IDataErrorInfo接口。您可以在 ViewModel 中轻松实现它,然后在绑定中添加一些标记,告诉他们期待验证,您可以在那里完成 - 尽管如果您想自定义如何警告用户错误,控件有一个ErrorTemplate
你可以设计适合的。