使用类系统填充列表框时,Windows 8电话System.StackOverflowException

时间:2014-07-21 10:08:37

标签: c# list xaml windows-phone-8 listbox

每次运行我的应用程序时都会出现System.StackOverflowException错误。此错误位于History类的最后一行。下面:

public class userHistory
{
    public string strTimeDate { get; set; }
    public string strUrl { get; set; }

    public List<userHistory> lstUserHistory { get; set; }

    public userHistory(string timedate, string url)
    {
        lstUserHistory.Add(new userHistory(timedate, url));
    }
}

我的MainPage代码:

 public List<userHistory> lstUserHistory;
    public userHistory selectedHistory;


public MainPage()
    {
        InitializeComponent();

        listBox.DataContext = lstUserHistory;
    }

private void getHistory(string url)
    {
        string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        userHistory usrHistory = new userHistory(time, url);
        lstUserHistory.Add(usrHistory);

        listBox.DataContext = null;
        listBox.DataContext = lstUserHistory;
    }

    private void listBox_Tap(object sender, GestureEventArgs e)
    {
        selectedHistory = listBox.SelectedValue as userHistory;

        MessageBox.Show(selectedHistory.strUrl);
        browserSearch(selectedHistory.strUrl);
    }

XAML

  <Grid>
                <ListBox ItemsSource="{Binding}" Foreground="RoyalBlue" Name="listBox" TabIndex="10"  Tap="listBox_Tap">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Vertical" Margin="0,329,0,367" >
                                <TextBlock Text="{Binding strDateTime}" FontSize="15" Margin="51,1,0,1"/>
                                <TextBlock Text="{Binding strUrl}" FontSize="28" Margin="51,1,0,1"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>

我认为错误可能是因为getHistory中发生了什么。可以使用相同的数据将此方法称为muitply times。我想要的是将数据存储在List中,这可以轻松添加新的历史记录或删除它们。然后只需在列表框中显示。

提前谢谢你:)

如果您需要更多详细信息,请发表评论,我将很乐意进一步详细解释:)

1 个答案:

答案 0 :(得分:2)

查看userHistory的这一部分:

public List<userHistory> lstUserHistory { get; set; }

public userHistory(string timedate, string url)
{
    lstUserHistory.Add(new userHistory(timedate, url));
}

这里有两个错误:

  • 构造函数调用自身(boom!stack overflow)
  • lstUserHistory.Add绝对为空时,构造函数调用lstUserHistory

目前尚不清楚为什么List<userHistory>中的MainPage代码都有userHistory。我认为你需要更仔细地考虑你正在建模的数据,以及真正所属的地方。

我怀疑你的userHistory课程看起来应该更像这样:

public sealed class HistoryEntry
{
    private readonly DateTime timestamp;
    private readonly string url;

    public DateTime Timestamp { get { return timestamp; } }
    public string Url { get { return url; } }

    public HistoryEntry(DateTime timestamp, string url)
    {
        this.timestamp = timestamp;
        this.url = url;
    }
}

注意:

  • 除非你真的需要这个类是可变的,否则让它变成不可变的
  • 遵循.NET命名约定
  • 避免使用只指定类型
  • 的名称前缀
  • 使用适当的数据类型来建模您感兴趣的内容 - 日期/时间不是自然是字符串
  • 决定这门课的作用是什么 - 是一个入口,还是整个历史?通过我的更改,很明显这只是一个条目。如果你需要将整个历史建模为一个单独的类,那么也要这样做,而不是试图将两者结合起来。