0

我完全是 C#/Visual Studio 的初学者,需要在这里朝着正确的方向努力。

我有一个 Main Window.xaml.cs 文件,其中有一个 TextBox 来接收名字,还有两个按钮,“Set”来更新一个名为 Student 的类,其中包含一个私有属性和一个“Clear " 按钮工作正常。

我无法弄清楚如何将我的字符串从文本框中获取到我的 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");
        }
    }
4

4 回答 4

1

您可能应该将您的 FirstName 属性设置为公开,无需将其设为私有。

您需要实例化您的学生班级,然后将文本框的值分配给该属性。

private Student s;
public MainWindow()
{
    InitializeComponent();
    s = new Student()
}
private void btnSet_Click(object sender, RoutedEventArgs e) {
    s.FirstName = txtFirstName.Text;
}

如果您发现无法从表单代码访问 Student 类,请检查您的命名空间。

于 2013-10-08T21:34:12.713 回答
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 类必须是这样的:

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 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;
    }
}
于 2013-10-08T22:13:43.983 回答
0

尝试这个:

在 xaml.cs 中:

注意 DataContext 是如何创建和用于检索数据的。

public MainWindow()
{
    InitializeComponent();
    DataContext = new Student();
}
private void Clear_Clicked(object sender, RoutedEventArgs e)
{
    ((Student)DataContext).FirstName = string.Empty;
}

将此类添加到与 MainWindow 相同的项目中:

使用 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);    
    }
}

在xml中:

将 xmlns... 添加到 xaml 的第一个,然后使用 Binding 从 FirstName 读取/写入数据。还要注意添加到绑定中的验证规则。

DataContext注意:除非手动更改,否则MainWindow 中的所有绑定都是相对于它的。(当你写{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>

在学生记录系统中:

注意:不要忘记使用dependencyProperty 而不是普通属性,否则绑定将不起作用。并且不要忘记从 DependencyObject 派生类(学生)

 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));
  }

你将不再需要“设置”按钮

于 2013-10-08T22:02:01.950 回答
0

如果您愿意,可以为学生类创建一个构造函数,如下所示:

public Student(string firstName)
{
    FirstName = firstName;
}

这将允许您执行以下操作:

学生 s = new Student("Josh");

请注意,此方法声明中的 firstName 有一个小写 f,而变量(至少在我的用法中)有一个大写 F。这不是常规的,我相信常规是使用驼峰式,但是放一个私有变量前的下划线 (_)。这主要是 C++ 约定,但由于 C# 的设计看起来与 C++ 相似,因此它适合这项工作。

于 2013-10-08T21:38:29.340 回答