C# 列表框问题可以';t从自定义类获取要在主页中输出的ItemsSource

C# 列表框问题可以';t从自定义类获取要在主页中输出的ItemsSource,c#,windows-phone-7,listbox,C#,Windows Phone 7,Listbox,我创建了一个名为MedinetParse的自定义类,用于解析webrequest。解析后的数据应该显示在my MainPage中名为mittSchemaListBox的列表框中。我现在面临的问题是,如果我在名为MedinetParse的自定义类中编写解析方法,列表框将不会显示任何内容。尽管当我在parse方法的最后一行代码中放置断点时,我可以看到mittSchemaListBox.ItemsSource拥有所有解析的项。同时,如果我将解析方法移动到MainPage.xaml.cs中,那么我将在列

我创建了一个名为MedinetParse的自定义类,用于解析webrequest。解析后的数据应该显示在my MainPage中名为mittSchemaListBox的列表框中。我现在面临的问题是,如果我在名为MedinetParse的自定义类中编写解析方法,列表框将不会显示任何内容。尽管当我在parse方法的最后一行代码中放置断点时,我可以看到mittSchemaListBox.ItemsSource拥有所有解析的项。同时,如果我将解析方法移动到MainPage.xaml.cs中,那么我将在列表框中看到所有解析的项

这是我的MedinetParsing课程

namespace WindowsPhonePanoramaApplication1
{
public class MedinetParsing : MainPage
{
    //Defining class properties
    public string Placering { get; set; }
    public string Datum { get; set; }
    //Defining class methods
    public void parseResults(string myresponse)
    {
        if (string.IsNullOrEmpty(myresponse))
        {
            return;
        }

        //Initiating a listbox and add item to it
        List<ItemViewModel> mittSchemaList = new List<ItemViewModel>();
        //Using HtmlAgilityPack to parse the HTMLcode from the response
        HtmlDocument htdoc = new HtmlDocument();
        htdoc.LoadHtml(myresponse);
        foreach (HtmlNode table in htdoc.DocumentNode.SelectNodes("//table[@class='list-medium']/tbody[1]/tr[@class]"))
        {
            //Removing ChildNode
            table.ChildNodes.RemoveAt(3);
            string itemValue = table.InnerText;
            //Changing the parsed date into a DateTime
            string d;
            DateTime datum = DateTime.Parse(itemValue.Remove(11));
            d = datum.ToString("D");
            //Adding items to the listbox
            mittSchemaList.Add(new ItemViewModel() { Datum = d, Placering = itemValue.Remove(0, 15) });
        }
        mittSchemaListBox.ItemsSource = mittSchemaList;

    }
}
}
最后这是我的列表框:-

<ListBox Margin="0,0,-12,0" Name="mittSchemaListBox" DataContext="{Binding}" ItemsSource="{Binding Path=Items}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="0,0,0,17">
                            <!--Replace rectangle with image-->
                            <Canvas Height="100" Width="100" Margin="12,0,9,0" Background="#FFE5001B">
                                <TextBlock Text="{Binding Datum}" TextWrapping="Wrap" Height="100" Margin="0" HorizontalAlignment="Right" Width="100" />
                            </Canvas>
                            <StackPanel Width="311">
                                <TextBlock Text="{Binding Placering}" TextWrapping="Wrap" Margin="0,10" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="36" TextAlignment="Center" FontWeight="Normal" />
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>


在过去的几个小时里,我一直在试图解决这个问题,但一事无成,我决定在这里提问。希望有人能告诉我问题出在哪里。

好的,根据你的评论,你做得不对。试试这个:

  • 您不需要新的MedinetParing类,只需将方法直接移动到后面的主页代码
  • 更新MainPage_加载方法,如下所示:
  • (或考虑将此代码移到VIEMDEM,因为您在这里使用它)

    编辑

    public class MedinetParsing //  : MainPage -- we don't need this inheritance
    {
        private readonly MainPage _mainPage;
    
        public MadinetParsing(MainPage mainPage)
        {
            _mainPage = mainPage;
        }
    
        // your code here
    
        // use the next line instead of commented one
        // mittSchemaListBox.ItemsSource = mittSchemaList;
        _mainPage.mittSchemaListBox.ItemsSource = mittSchemaList;
    }
    

    但是,正如我前面所说的,最好的解决方案是在ViewModel中进行解析,并使用绑定来填充列表框。

    昨晚无法回答我的问题,因此下面是答案

    又一次,经过几个小时的反复使用我的代码,我找到了一个适合我的应用程序的解决方案。解决方案是我在MedinetParsing类中更改了这行代码

    mittSchemaList.Add(new ItemViewModel() { Datum = d, Placering = itemValue.Remove(0, 15) });
    
    关于这一点:

    App.ViewModel.Items.Add(new ItemViewModel() {Datum=d,Placering=itemValue.Remove(0,15)}); 
    
    删除了这行代码:-

    mittSchemaListBox.ItemsSource = mittSchemaList;
    
    现在它工作正常,我很高兴;)。 希望这将帮助其他人,如果他们面临这样的问题


    您的

    几个问题:列表框在哪里声明?在主页上?为什么要从主页继承MedinetParsing?您正在加载的主页中创建MedinetParsing的新实例,为什么需要它请在您的问题中澄清这一时刻让我首先说,加载的主页中的MedinetParing的新实例是启动parseResults方法。我更正了张贴的代码,它是漏打的。我使用类MedinetParsing:MainPage的原因是为了访问mittSchemaListBox,它是.xaml中列表框的名称。现在转到主页上关于Listbox declaretion的最后一个问题。我不知道该在哪里声明,因为我的动作回调。。。是要执行的最后一行代码,因此在此之后的任何代码行都不会被读取。那么,您不应该使用类MedinetParsing:MainPage来访问mittSchemaListBox,它只是另一个列表框,它与所显示的完全无关。那么如何从自定义类中访问mittSchemaListBox?不要在自定义类中执行此操作,而是在MainPage类中执行此操作。请看下面我的答案。我知道我可以在主页上完成整个解析,而且它正在工作。虽然我仍然想知道是否有某种方法可以解析另一个类中的数据?感谢您的帮助和时间,我刚刚找到了一种非常合适的方法。我会将其作为答案发布。现在无法回答我的问题,但这是答案,我稍后会更新。又一次,经过几个小时的反复使用我的代码,我找到了一个适合我的应用程序的解决方案。解决方案是我在MedinetParsing类'code'mittSchemaList.Add(new ItemViewModel(){Datum=d,placeing=itemValue.Remove(0,15)})中更改了这一行代码用这个代码“code:-“code”App.ViewModel.Items.Add(newitemviewmodel(){Datum=d,placeing=itemValue.Remove(0,15)});'code'删除了这行代码:-'code'mittSchemaListBox.ItemsSource=mittSchemaList;'代码'
    App.ViewModel.Items.Add(new ItemViewModel() {Datum=d,Placering=itemValue.Remove(0,15)}); 
    
    mittSchemaListBox.ItemsSource = mittSchemaList;