我有一个第二个窗口,当搜索某个姓名时会打开,此窗口会提示您在两个具有相同名称的工作人员之间进行选择。然后,窗口需要将值返回到父窗口,以使用xml文件中的相关数据填充数据窗口。
我尝试创建一个字符串,该字符串将根据单击的按钮更新值,然后可以将此字符串返回到第一个窗口上的调用方法,并在Linq to 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; }
}
你认为二传手怎么办?它有两个问题:
你可以通过保留手动声明的字段,修复命名约定以及更改属性以将变量设置为value
来解决此问题:
private string staffChoice;
public string StaffChoice
{
get { return staffChoice; }
set { staffChoice = value; }
}
但是,使用自动实现的属性会更简单:
public string StaffChoice { get; set; }
这将自动为您创建支持字段和getter / setter。
答案 1 :(得分:3)
最简单的方法是声明这样的属性......
public string StaffChoice { get; set; }
你的问题是你基本上是在同一个setter中调用属性setter - 因此你有一个递归循环。您可以像这样更改代码以使其正常工作......
private string StaffChoice;
public string staffChoice
{
get { return this.StaffChoice; }
set { StaffChoice = value; }
}
答案 2 :(得分:2)
您的setter不正确,您正在为自己分配一个值(导致无限循环)而不使用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();
}
答案 3 :(得分:2)
您的财产应该是:
public string staffChoice
{
get { return this.StaffChoice; }
set { this.StaffChoice = value; }
}
在你的代码中,你在setter中再次调用setter - 因此无限递归。
但是,由于你没有在setter中做任何特别的事情(比如通知UI该属性已经改变了,你可以简单地:
public string staffChoice { get; set; }
这个“自动财产”有点清洁。
(顺便说一句:通常的做法是让后面的变量以小写字母开头,公共属性以大写字母开头。但是,如果你在应用程序中保持一致并不重要。)< / p>