从主窗口中访问类中的方法

本文关键字:方法 访问 窗口 | 更新日期: 2023-09-27 18:16:23

我试图创建一个WPF应用程序的学生注册与一个简单的表格包含姓名,入学编号,学分等。我有一个Mainwindow.xaml和一个Student.cs

在我的MainWindow.xaml中,我有一个高级按钮,应该根据学分来提高学生的水平(如果学生有超过120学分,级别应该提高到"2")

这是Student.cs与Advance()方法

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

主窗口。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!");
        }
    }

从主窗口中访问类中的方法

真的你应该做这个绑定,你绑定的水平文本框到学生的水平属性,在你的模型上实现iNotifyPropertyChanged。我建议你研究一下装订,然后这样重新设计。

但是,如果您希望继续当前的设计,我建议您进行以下更改以实现您期望的行为:

1)在btnSet_Click中,删除这一行:student.Level = int.Parse(txtLevel.Text);你的级别不应该由文本框设置;应该通过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        
}

我认为最简单的方法是省略集合,然后让btnAdvance做这两件事。问题是集合中的学生事先不存在,因为它是一个不同的往返。

。Advance必须查看文本框并确定

您正在更新您的模型项,而没有将控件设置为更新后的值。