2012-05-13 3 views
0

Webリクエストを解析するカスタムクラスのMedinetParseを作成しました。解析されたデータは、my MainPageのmittSchemaListBoxというリストボックスに表示されます。私が今直面している問題は、リストボックスに何も表示されないMedinetParseという名前のカスタムクラスに解析メソッドを書き込む場合です。私がパースメソッドの最後のコード行にブレークポイントを置くと、私はmittSchemaListBox.ItemsSourceにすべての解析された項目があることがわかります。一方、私がMainPage.xaml.csに解析メソッドを移動すると、リストボックス内のすべての解析されたアイテムが表示されます。リストボックスの問題で、カスタムクラスからItemsSourceをメインページに出力できない

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> 

をしようとしてここ

は私の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; 

    } 
} 
} 

は、解析を開始するコードですここ数時間、この問題を解決してどこにも行かないために、私はここで尋ねることに決めました。誰かが私に問題点を教えてくれることを願っています。

+0

いくつかの質問:リストボックスはどこで宣言されていますか?メインページに?なぜMainPageからMedinetParsingを継承していますか? MainPage_LoadedにMedinetParsingの新しいインスタンスを作成していますが、なぜそれが必要ですか?あなたの質問でこの瞬間を明確にしてください。 –

+0

MainPage_LoadedのMedinetParingの新しいインスタンスは、parseResultsメソッドを開始することです。私はミスタイプの投稿コードを修正しました。私がClass MedinetParsing:MainPageを使用した理由は、.xamlのListBoxの名前であるmittSchemaListBoxにアクセスすることです。今度はMainPageのリストボックス宣言についての最後の質問に。私はどこに宣言するか分からない私のアクションコールバック...コード行の最後の行ですので、これを読むことはできません。 – DreamNet

+0

よくMedinetParsingクラス:MainPageを使用してmittSchemaListBoxにアクセスする必要はありません。これは別のリストボックスであり、表示されているものとはまったく関係ありません。 –

答えて

0

私は昨夜私の質問に答えることができませんでしたのでここに答えがあります。

もう一度私のコードで前後して、私はちょうど私のアプリに合った解決策を見つけました。解決策は、私はこの1つで私のMedinetParsingクラス

mittSchemaList.Add(new ItemViewModel() { Datum = d, Placering = itemValue.Remove(0, 15) }); 

にこのコード行を変更したことである: - :今すぐ

mittSchemaListBox.ItemsSource = mittSchemaList; 

-

App.ViewModel.Items.Add(new ItemViewModel() {Datum=d,Placering=itemValue.Remove(0,15)}); 

のコード行を処分しましたそれは私が幸せでなければならないように働いています;)。 このような問題に直面した場合、これは他の人に役立つことを願っています。

あなたの

0

あなたのコメントによれば、あなたは間違ったやり方をしています。試してみてください、この1:

  1. あなただけのメインページのコードビハインド
  2. 更新MainPage_Loaded方法は次のようにメソッドを直接動かし、新しいMedinetParingクラスは必要ありません:

(または移動することを検討あなたがここに何とかそれを使用しているとの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); 
} 

EDIT

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を作成することです。

+0

私はMainPageで全体の解析を行うことができ、動作していることは分かっています。他のクラスのデータを解析する方法があるのか​​まだ疑問に思っていますが? – DreamNet

+0

もちろん、あなたは私の答えの編集を見ることができます –

+0

あなたの助けと時間のおかげで、私はちょうどそれを行うには非常に適切な方法を見つけた。私は答えとして投稿します。 – DreamNet

関連する問題