2012-01-19 12 views
0

特定のstaffnameが検索されたときに開く第2のウィンドウがあり、同じ名前のスタッフ2人を選択するように求められます。ウィンドウは親ウィンドウに値を返す必要があり、xmlファイルの関連データをデータ・テンプレートに取り込みます。C#でプロパティアクセサを使用すると無限ループエラーが発生する

どのボタンがクリックされたかによって値が更新される文字列を作成しようとしましたが、この文字列は最初のウィンドウの呼び出し元メソッドに返され、LinqからXmlクエリのバインディングデータが取り込まれます。

しかし、実行すると、stackoverflow例外が発生し、無限ループになる可能性があります。私は何を変更するかを知るためにC#について十分にはわかりません。

public partial class Choice : Window 
{ 
    private string StaffChoice; 

    public Choice() 
    {      
     InitializeComponent(); 
    } 
    public string staffChoice 
    { 
     get { return this.StaffChoice; } 
     set { staffChoice = StaffChoice; } 
    } 

    private void btnMRG_Click(object sender, RoutedEventArgs e) 
    { 
     StaffChoice = "MRG"; 
     this.Close(); 
    } 

    private void btnRPG_Click(object sender, RoutedEventArgs e) 
    { 
     StaffChoice = "RPG"; 
     this.Close(); 
    } 
} 

ご意見やご提案は素晴らしいと思います。

ありがとうございます!

+0

あなたのセッターを調べてください –

答えて

3

はまず、ユーザーの命名規則は間違っている - フィールドstaffChoice呼ばれるべきと財産StaffChoiceと呼ばれるべきです。詳細については、.NET naming conventionsをお読みください。しかし、あなたの財産を詳しく見てみましょう。

public string staffChoice 
{ 
    get { return this.StaffChoice; } 
    set { staffChoice = StaffChoice; } 
} 

セッターはどう思いますか?それには2つの問題があります:

  • 設定しようとしている値は無視されます。
  • それ自体を再帰的に呼び出します。

あなたは、手動で宣言したフィールドを維持する命名規則を固定し、このようなvalueに変数を設定するためのプロパティを変更することにより、この問題を解決することができます:

private string staffChoice; 

public string StaffChoice 
{ 
    get { return staffChoice; } 
    set { staffChoice = value; } 
} 

しかし、それは次のようになり

public string StaffChoice { get; set; } 

これは自動的にバッキングフィールドとゲッター/セッターを作成します。

+0

私はゲッターが大丈夫だと思います。私はセッターが間違っていると思う。彼は非標準的な命名規則を使用しています –

+0

@ 32bitkid:はい、私はちょうどそのビットに気づいただけです。イク! –

+0

そのクール。それは起こる:) –

2

設定者が正しくない場合は、valueを使用せずに、無限ループの原因となる値を割り当てています。

あなたは、このようにコードを変更する必要があり、あなたの命名規則は、私はそれを修正して、後方に見えたあなたは気にしないことを望む:

private string staffChoice; 

public Choice() 
{      
    InitializeComponent(); 
} 

public string StaffChoice 
{ 
    get { return staffChoice; } 
    set { staffChoice = value; } 
} 

private void btnMRG_Click(object sender, RoutedEventArgs e) 
{ 
    staffChoice = "MRG"; 
    this.Close(); 
} 

private void btnRPG_Click(object sender, RoutedEventArgs e) 
{ 
    staffChoice = "RPG"; 
    this.Close(); 
} 
+0

ちょっと訂正に問題はありません、まだ一般的な開発には全く新しいので、ちょうど私が行くように学習! – markhlong

2

あなたの財産は、次のようになります。

あなたに
public string staffChoice 
{ 
    get { return this.StaffChoice; } 
    set { this.StaffChoice = value; } 
} 

setterで再びsetterを呼び出しているので、無限の再帰です。あなたはプロパティが変更されたUIを通知するように(セッターに特別なことをしていないよう

しかし、あなたは単にかもしれない:

public string staffChoice { get; set; } 

この「autoプロパティが」少しクリーナーです

(通常、小文字で始まるバック変数と大文字で始まるpublicプロパティがありますが、アプリケーションに一貫性がある場合は、それほど問題になりません)

3

最も単純です方法は、このようなプロパティを宣言することです...

public string StaffChoice { get; set; } 

あなたの問題はあなたが基本的には同じセッター内からプロパティのセッターを呼び出しているである - ので、あなたは再帰ループを持っています。あなたはこのようにあなたのコードを変更することができます...

private string StaffChoice; 

public string staffChoice 
{ 
    get { return this.StaffChoice; } 
    set { StaffChoice = value; } 
} 
関連する問題