0

Web リクエストを解析する MedinetParse という名前のカスタム クラスを作成しました。解析されたデータは、メイン ページの 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 に答える