无法为数组的一部分设置值

时间:2015-01-19 16:23:50

标签: c# wpf

在我的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类实例。

如果需要更多信息,请告诉我,否则感谢您的帮助。

1 个答案:

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

但是,数组中的任何更改都不会反映回S1S2等等。因此,最好将这些更改更改为更像:

public String S1 
{
  get{ return SAll[0];}
  set{ SAll[0] = value;}
}