0

我创建了一个名为 MedinetParse 的自定义类来解析 web 请求。解析后的数据应显示在我的 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;

    }
}
}

这是启动解析的代码:-

    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>

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

4

2 回答 2

0

好的,根据你的评论,你做错了。试试这个:

  1. 您不需要新的 MedinetParing 类,只需将方法直接移动到 MainPage 代码隐藏
  2. 更新 MainPage_Loaded 方法如下:

(或考虑将此代码移动到 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。

于 2012-05-13T20:22:20.430 回答
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;

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

你的

于 2012-05-14T09:05:49.413 回答