ListBox问题无法从自定义类中获取ItemsSource以在MainPage中输出

时间:2012-05-13 19:11:45

标签: c# windows-phone-7 listbox

我创建了一个名为MedinetParse的自定义类来解析webrequest。解析后的数据应显示在my MainPage中名为mittSchemaListBox的列表框中。我现在面临的问题是,如果我在名为MedinetParse的自定义类中编写解析方法,则列表框不会显示任何内容。虽然当我在解析方法的最后一行代码中放置一个断点时,我可以看到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;

    }
}
}

以下是启动解析的代码: -

    public void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData();
        }
        MedinetWebRequest mittschema = new MedinetWebRequest();
        MedinetParsing mittparse = new MedinetParsing();
        mittschema.url = "https://medinet.se/cgi-bin/doctor.pl?action=login&customer=******&language=se";
        Action callback = () => Dispatcher.BeginInvoke(() => mittparse.parseResults(mittschema.myresponse));
        mittschema.getrequest(callback); 
    }

最后这是我的列表框: -

<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>

过去几个小时试图解决这个问题而没有到达任何地方,我决定在这里问一下。希望有人能告诉我这是什么问题。

2 个答案:

答案 0 :(得分:0)

好的,根据你的评论,你的做法是错误的。试试这个:

  1. 您不需要新的MedinetParing类,只需将方法直接移到MainPage代码隐藏
  2. 更新MainPage_Loaded方法如下:
  3. (或考虑将此代码移动到ViewModel,因为您在此处以某种方式使用它)

    public void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData();
        }
    
        MedinetWebRequest mittschema = new MedinetWebRequest();
        mittschema.url = "https://medinet.se/cgi-bin/doctor.pl?action=login&customer=******&language=se";
        Action callback = () => Dispatcher.BeginInvoke(() => this.parseResults(mittschema.myresponse));
        mittschema.getrequest(callback); 
    }
    

    修改

    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中进行解析并使用绑定来填充ListBox。

答案 1 :(得分:0)

昨晚无法回答我的问题,所以答案就是这样。

再过几个小时来回我的代码,我发现了一个适合我的应用程序的解决方案。解决方案是我在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;

现在它正常运作,我很高兴;)。 希望如果他们遇到这样的问题,这将有所帮助。

此致