0

私は C#/Visual Studio の初心者であり、ここで正しい方向に突き進む必要があります。

私はメイン Window.xaml.cs ファイルを持っています。このファイルには、名前を受け取るための TextBox と、2 つのボタン、"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;
}

Form コードから 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);    
    }
}

xamlで:

xmlns... を最初の xaml に追加し、Binding を使用して FirstName との間でデータの読み取り/書き込みを行います。また、バインディングに追加された検証ルールにも注意してください。

注: MainWindow のすべての BindingDataContextは、手動で変更されない限り、それに関連してアドレス指定されます。(あなたが書くとき、{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));
  }

「設定」ボタンはもう必要ありません

于 2013-10-08T22:02:01.950 に答える
0

必要に応じて、次のように学生クラスのコンストラクターを作成できます。

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

これにより、次のようなことができます。

Student s = new Student("ジョシュ");

このメソッドの宣言の firstName は小文字の f であるのに対し、変数 (少なくとも私の使用法では) は大文字の F であることに注意してください。プライベート変数の前にアンダースコア (_) を付けます。これは主に C++ の規則ですが、C# は C++ に似た外観になるように設計されているため、この作業に適しています。

于 2013-10-08T21:38:29.340 に答える