从MainWindow访问类中的方法

3

我正尝试创建一个WPF应用程序,用于学生注册,其中包含姓名、学号、学分等简单表单。我有一个MainWindow.xaml和一个Student.cs

在我的MainWindow.xaml中,我有一个高级按钮,应该根据学分提升学生的等级(如果学生的学分超过120分,则等级应提升到“2”)。

这是带有Advance()方法的Student.cs

class Student
{
    private int matric;                            
    private int level;                  
    private int credits;                

    public Student() { }       

    public int Matric                   
    {
        get { return matric; }          
        set                            
        {
           //there should be a range check for the 
            matric = value;
        }
    }

    public int Level
    {
        get { return level; }
        set { level = value; }
    }

    public int Credits
    {
        get { return credits; }
        set { credits = value; }
    }

    //this is my problem:

    public int Advance() 
    {
        if (Credits >= 0 && Credits < 120)
        {
            return Level;
        }
        else if (credits >= 120)
        {
            return Level++;
        }
        else if (credits >= 240)
        {
            return Level++;
        }
        else if (Credits >= 360)
        {
            return Level++;
        }
        else
        {
            return 0;
        }
    }
}       

MainWindow.xaml,只包括按钮和文本框的部分。

<TextBox x:Name="txtLevel" HorizontalAlignment="Left" Height="23" Margin="184,266,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <TextBox x:Name="txtCredit" HorizontalAlignment="Left" Height="23" Margin="184,328,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <Button x:Name="btnAdvance" Content="Advance" HorizontalAlignment="Left" Margin="324,267,0,0" VerticalAlignment="Top" Width="75" Click="btnAdvance_Click"/>

我试图调用方法MainWindow.xaml.cs

public partial class MainWindow : Window
{
    Student student;
    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnSet_Click(object sender, RoutedEventArgs e)
    {
        student = new Student();            
        student.Credits = int.Parse(txtCredit.Text);
        student.Level = int.Parse(txtLevel.Text);

    }

    private void btnAdvance_Click(object sender, RoutedEventArgs e)
    {
        student.Advance();              //this should be the call of the method
    }
}

当然它没起作用... 有人可以帮帮我吗?

编辑 这就是我现在的代码,还是不起作用。

    public void Advance()
    {
        if (Credits >= 0 && Credits < 120)
        {
            Level = 1;
        }
        else if (credits >= 120 && Level == 1)
        {
            Level = 2;
        }
        else if (credits >= 240 && Level == 2)
        {
            Level = 3;
        }
        else if (Credits >= 360 && Level == 3)
        {
            Level = 4;
        }
        else if (Level == 4)
        {
            MessageBox.Show("You can't advance more!");
        }
        else
        {
            MessageBox.Show("Advance is not possible!");
        }
    }

你遇到了什么错误? - Fᴀʀʜᴀɴ Aɴᴀᴍ
如果您希望UI反映student中的更改,则需要在调用student.Advance()之后更新txtLevel - crashmstr
1
txtLevel.Text = student.Level.ToString();?这只是在 btnSet_Click 中所做的相反操作(但您应该检查以确保 sudent != null,并且还需要考虑何时创建一个 new student 以及如果他们继续点击您的 Advance 按钮会发生什么)。 - crashmstr
1
如果我理解你的代码正确,你还需要更新Advance方法的逻辑,将Level包含在你的条件语句中:else if (credits >= 120 && Level == 1)。否则,多次点击Advance将继续增加Level,而不会将信用额度调整得更高。 - Bobby
是的,@Bobby,你说得对...即使它不应该,它也会这样做... - Koosshh56
显示剩余6条评论
3个回答

1

实际上,你应该使用绑定来完成这个任务,将Level文本框绑定到学生的Level属性上,并在模型上实现iNotifyPropertyChanged。我建议你研究一下绑定并以这种方式重新设计它。

然而,如果你想按照当前的设计继续进行,以下是我建议的更改以实现你所期望的行为:

1)在btnSet_Click中,删除这行代码:student.Level = int.Parse(txtLevel.Text); 你的Level不应该由文本框设置,它应该由Advance方法设置。

2)你的Advance方法应该像下面这样:

public int Advance()
    {
        if (Credits >= 0 && Credits < 120)
        {
            level = 1;
        }
        else if (credits >= 120 && credits < 240)
        {
            level = 2;
        }
        else if (credits >= 240 && credits < 360)
        {
            level = 3;
        }
        else if (Credits >= 360)
        {
            if (level != 4)
            {
                level = 4;
            }
            else 
            {
                MessageBox.Show("You can't advance more!");
            }
        }
        else
        {
            MessageBox.Show("Advance is not possible!");
        }

        return level;
    }

3)将IsReadOnly="True"属性添加到级别文本框中,因为它不应该从界面上设置。

<TextBox x:Name="txtLevel" IsReadOnly="True" HorizontalAlignment="Left" Height="23" Margin="184,266,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>

4) 由于您没有使用绑定,在Advance_click中,您需要将返回的值发送回接口:

private void btnAdvance_Click(object sender, RoutedEventArgs e)
{
    txtLevel.Text = student.Advance();              //this should be the call of the method        
}

0

我认为最简单的方法是省略set,然后让btnAdvance同时完成两个任务。问题在于set中的学生在advance中不存在,因为这是一个不同的往返。

也就是说,Advance必须查看文本框并进行计算。


0

你正在更新你的模型项目,但之后没有将你的控件设置为更新后的值。


@Koosshh56 我想你期望文本框显示该值。我在您的代码中没有看到任何尝试写回文本框的内容,更新您的业务对象(学生)后。 - Dbl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接