我是C#/ Visual Studio的初学者,需要朝着正确的方向努力。
我有一个Main Window.xaml.cs文件,其中我有一个TextBox来接收名字,还有两个按钮,“Set”来更新一个名为Student的类,其中包含一个私有属性,一个“清除”按钮,工作正常。
我无法弄清楚如何将我的字符串从文本框中导入到我的Student类中,并且需要在添加更多属性之前将其设置为正确。
将非常感激地收到任何帮助。
主窗口代码如下
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnSet_Click(object sender, RoutedEventArgs e)
{
}
private void btnClear_Click(object sender, RoutedEventArgs e)
{
txtFirstName.Clear();
}
我的学生班级代码如下
namespace StudentRecordsSystem
{
public class Student
{
private string FirstName
{
get
{
throw new System.NotImplementedException();
}
set
{
// check that string is not empty
if (string.IsNullOrEmpty(value) == true)
throw new ArgumentOutOfRangeException("Please enter a first name");
}
}
答案 0 :(得分:1)
您可能应该将FirstName属性设置为public,不需要将其设置为私有。
您需要实例化您的学生班级,然后将文本框的值分配给该属性。
private Student s;
public MainWindow()
{
InitializeComponent();
s = new Student()
}
private void btnSet_Click(object sender, RoutedEventArgs e) {
s.FirstName = txtFirstName.Text;
}
如果您发现无法从表单代码访问Student类,请检查命名空间。
答案 1 :(得分:0)
如果你愿意,你可以为学生班制作一个构造函数,如下所示:
public Student(string firstName)
{
FirstName = firstName;
}
这可以让你做这样的事情:
学生s =新学生(“Josh”);
请注意,此方法声明中的firstName具有小写f,而变量(至少在我的用法中)具有大写字母F.这不是常规的,我相信惯例是使用camelcase,但是在私有变量前放置下划线(_)。这主要是一个C ++约定,但由于C#的设计看起来类似于C ++,因此适合这项工作。
答案 2 :(得分:0)
试试这个:
xaml.cs中的:
注意DataContext是如何创建并用于检索数据的。
public MainWindow()
{
InitializeComponent();
DataContext = new Student();
}
private void Clear_Clicked(object sender, RoutedEventArgs e)
{
((Student)DataContext).FirstName = string.Empty;
}
将此类添加到与MainWindow相同的Project:
使用ValidationRule的目的是避免烦人的messageBox,而是在违反规则时标记其控制。
public class NamesValidationRule : ValidationRule
{
public string MinimumLetters { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var str = value as string;
if(str == null)
return new ValidationResult(false, "Please enter first name");
if(str.Length < Convert.ToInt32(MinimumLetters))
return new ValidationResult(false, string.Format("Minimum Letters should be {0}", MinimumLetters));
return new ValidationResult(true, null);
}
}
xaml中的:
将xmlns ...添加到xaml的第一个,然后使用Binding从/向FirstName读取/写入数据。还要注意添加到绑定的验证规则。
注意:除非手动更改,否则MainWindow中的所有绑定都将相对于其DataContext
进行寻址。 (当你写{Binding FirstName}
时,它意味着DataContext.FirstName
)
<MainWindow xmlns:local="clr-namespace:MyNamespace.Project1"
...>
...
<TextBox>
<TextBox.Text>
<Binding Path="FirstName" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:NamesValidationRule MinimumLetters="3" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
...
<Button Content="Clear" Click="Clear_Clicked"/>
...
</MainWindow>
在StudentRecordsSystem中:
注意:不要忘记使用dependencyProperty而不是普通属性,否则绑定将不起作用。并且不要忘记从DependencyObject派生类(Student)
using System.Windows;
...
public class Student : DependencyObject
{
//FirstName Dependency Property
public string FirstName
{
get { return (string)GetValue(FirstNameProperty); }
set { SetValue(FirstNameProperty, value); }
}
public static readonly DependencyProperty FirstNameProperty =
DependencyProperty.Register("FirstName", typeof(string), typeof(Student), new UIPropertyMetadata(null));
}
,您将不再需要“设置”按钮
答案 3 :(得分:0)
MainWindow应该是这样的:
public partial class MainWindow : Window
{
private Student myOnlyStudent;
public MainWindow()
{
InitializeComponent();
myOnlyStudent = new Student()
}
private void btnSet_Click(object sender, RoutedEventArgs e)
{
myOnlyStudent.FirstName = txtFirstName.Text;
}
private void btnClear_Click(object sender, RoutedEventArgs e)
{
txtFirstName.Clear();
}
}
如果你坚持使用属性抛出异常,那么Student class必须是这样的:
public class Student
{
private string mFirstName;
public string FirstName
{
get
{
return mFirstName;
}
set
{
if (string.IsNullOrEmpty(value) == true)
throw new ArgumentOutOfRangeException("Please enter a first name");
mFirstName = value;
}
}
}
但对于您级别的入门者,我建议您使用public而不是private和skip属性(可见性和属性都很复杂):
public class Student { public string FirstName; }
public partial class MainWindow : Window
{
private void btnSet_Click(object sender, RoutedEventArgs e)
{
if (string.isNullOrEmpty(txtFirstName.Text))
throw new Exception("Please type first name!");
myOnlyStudent.FirstName = txtFirstName.Text;
}
}