在我的WPF应用程序中,在一个屏幕上,它有一系列文本框,如下所示:
此窗口的内容是从控件模板生成的,当按下按钮时,它会运行此方法将值更新为类中的公共对象(thisPMX,如下面的代码所示):
private void UpdatePMX()
{
thisPMX.Name = tbName.Text;
thisPMX.Month = tbMonth.Text;
thisPMX.Day = tbDay.Text;
thisPMX.Year = tbYear.Text;
for(int i = 0; i < 8; i++)
{
string thisBehavior = "Behavior0" + (i + 1).ToString();
ControlTemplate temp = ((Label)this.FindName(thisBehavior)).Template;
if(((TextBox)temp.FindName("BName", behaviors[i])).Text.Length > 0)
{
thisPMX.Behaviors[i].Name = ((TextBox)temp.FindName("BName", behaviors[i])).Text;
}
if (((TextBox)temp.FindName("BehaviorWeight", behaviors[i])).Text.Length > 0)
{
thisPMX.Behaviors[i].Weight = ((TextBox)temp.FindName("BehaviorWeight", behaviors[i])).Text;
}
for(int e = 0; e < 10; e++)
{
if (((TextBox)temp.FindName(("S" + ((e + 1).ToString())), behaviors[i])).Text.Length > 0)
{
string scoreInst = ((TextBox)temp.FindName("S" + (e + 1).ToString(), behaviors[i])).Text;
thisPMX.Behaviors[i].SAll[e] = (scoreInst.ToString().Trim());
string Inst = thisPMX.Behaviors[i].SAll[e]; // Break Here For Testing Value
}
}
}
}
此方法按预期工作,直到最后一个for语句,其中不更新可能的分数框中的值。此时我在其周围添加了字符串以进行调试,如上所示。当我在评论指出的点放置断点时,scoreInst的值为“1”i为0且e为0但是当我将scoreInst分配给thisPMX.Behaviors[i].SAll[e]
时,它似乎不接受该值和Inst出来是空的。
这是包含SAll字符串[]的行为类:
public class Behavior
{
public Behavior()
{
}
public string Name { get; set; }
public string BehaviorMeasure { get; set; }
public string Weight { get; set; }
public string S1 { get; set; }
public string S2 { get; set; }
public string S3 { get; set; }
public string S4 { get; set; }
public string S5 { get; set; }
public string S6 { get; set; }
public string S7 { get; set; }
public string S8 { get; set; }
public string S9 { get; set; }
public string S10 { get; set; }
public bool ValuesSatisfied
{
get
{
if ((ActiveScores < 3) || !(BehaviorMeasure.Length == 0) || !(Weight.Length == 0) || !(Name.Length == 0))
{
return false;
}
else
{
return true;
}
}
}
public bool HasActiveValues
{
get
{
if (Name != null && Weight != null)
{
if ((ActiveScores > 0) || (Name.Length > 0) || (Weight.Length > 0))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
}
public string[] SAll
{
get
{
string[] Scores = { S1, S2, S3, S4, S5, S6, S7, S8, S9, S10 };
return Scores;
}
}
public int ActiveScores
{
get
{
int count = 0;
for(int i = 0; i < SAll.Length; i++)
{
if (SAll[i] != null && SAll[i].Length > 0)
{
++count;
}
}
return count;
}
}
}
我没有得到任何异常或错误,但是当调用UpdatePMX()方法时,可能的分数文本框中的值没有被设置为SAll数组值。
期望的结果是,此方法能够成功地将xaml中各种文本框中的值传递到“thisPMX”类实例中的各种Behavior值。
备注:
thisPMX是一个公共类实例,其中有8个如上所示的Behaviors类实例。
如果需要更多信息,请告诉我,否则感谢您的帮助。
答案 0 :(得分:2)
问题是您在SAll
中设置的值总是丢失,因为SAll
总是返回一个新数组。因此,当您尝试从刚刚插入的数组中获取数据时,您实际上只是获得了一个新数组。
问题代码:
public string[] SAll
{
get
{
string[] Scores = { S1, S2, S3, S4, S5, S6, S7, S8, S9, S10 };
return Scores;
}
}
应该更像是:
private string[] _sAll;
public string[] SAll
{
get
{
if(_sAll == null)
_sAll = { S1, S2, S3, S4, S5, S6, S7, S8, S9, S10 };
return _sAll;
}
}
但是,数组中的任何更改都不会反映回S1
,S2
等等。因此,最好将这些更改更改为更像:
public String S1
{
get{ return SAll[0];}
set{ SAll[0] = value;}
}