我创建了一个名为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>
过去几个小时试图解决这个问题而没有到达任何地方,我决定在这里问一下。希望有人能告诉我这是什么问题。
答案 0 :(得分:0)
好的,根据你的评论,你的做法是错误的。试试这个:
(或考虑将此代码移动到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;
现在它正常运作,我很高兴;)。 希望如果他们遇到这样的问题,这将有所帮助。
此致