通过验证0将文本框字符串转换为属性

时间:2013-10-08 21:28:41

标签: c# wpf visual-studio

我是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");
        }
    }

4 个答案:

答案 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;
    }
}