我正构建我的第一个WP8应用程序,它通过linq-to-sql连接到数据库,我想在LongListSelector中显示数据。但是在Emulator中启动后没有任何东西出现在黑屏上。
我可以问我在哪里弄错了吗?我使用WCF连接这是MainPage.xaml.cs
using PhoneApp1.Resources;
using PhoneApp1.ToursServiceReference1;
namespace PhoneApp1
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
// Sample code to localize the ApplicationBar
//BuildLocalizedApplicationBar();
}
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
ToursServiceReference1.ToursService1Client serviceClient = new ToursServiceReference1.ToursService1Client();
serviceClient.GetAllKlientsCompleted += new EventHandler<ToursServiceReference1.GetAllKlientsCompletedEventArgs>(serviceClient_GetAllKlientsCompleted);
serviceClient.GetAllKlientsAsync();
}
private void serviceClient_GetAllKlientsCompleted(object sender, ToursServiceReference1.GetAllKlientsCompletedEventArgs e)
{
if (e.Result != null)
{
LLS.ItemsSource = e.Result;
}
}
吨
这是MainPage.xaml
<phone:PhoneApplicationPage
x:Class="PhoneApp1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="ToursDataTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Margin="10" Text="{Binding name}"/>
</StackPanel>
</DataTemplate>
<Style x:Key="LongListSelectorStyle1" TargetType="phone:LongListSelector">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="phone:LongListSelector">
<Grid Background="{TemplateBinding Background}" d:DesignWidth="480" d:DesignHeight="800">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ScrollStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="00:00:00.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Scrolling"/>
<VisualState x:Name="NotScrolling"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</phone:PhoneApplicationPage.Resources>
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="0*"/>
</Grid.RowDefinitions>
<!-- LOCALIZATION NOTE:
To localize the displayed strings copy their values to appropriately named
keys in the app's neutral language resource file (AppResources.resx) then
replace the hard-coded text value between the attributes' quotation marks
with the binding clause whose path points to that string name.
For example:
Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}"
This binding points to the template's string resource named "ApplicationTitle".
Adding supported languages in the Project Properties tab will create a
new resx file per language that can carry the translated values of your
UI strings. The binding in these examples will cause the value of the
attributes to be drawn from the .resx file that matches the
CurrentUICulture of the app at run time.
-->
<!--TitlePanel contains the name of the application and page title-->
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"/>
<TextBlock HorizontalAlignment="Left" Margin="60,44,0,-91" Grid.Row="1" TextWrapping="Wrap" Text="Připojení SQL" VerticalAlignment="Top" Height="47" Width="348" TextAlignment="Center" FontWeight="Bold" FontSize="36"/>
<phone:LongListSelector x:Name="LLS" HorizontalAlignment="Left" ItemsSource="{Binding name}" ItemTemplate="{StaticResource ToursDataTemplate}" Height="407" Margin="47,164,0,-571" Grid.RowSpan="2" VerticalAlignment="Top" Width="365"/>
<!--Uncomment to see an alignment grid to help ensure your controls are
aligned on common boundaries. The image has a top margin of -32px to
account for the System Tray. Set this to 0 (or remove the margin altogether)
if the System Tray is hidden.
Before shipping remove this XAML and the image itself.-->
<!--<Image Source="/Assets/AlignmentGrid.png" VerticalAlignment="Top" Height="800" Width="480" Margin="0,-32,0,0" Grid.Row="0" Grid.RowSpan="2" IsHitTestVisible="False" />-->
</Grid>
很抱歉提供这么大的代码但是到目前为止我还不知道错误可能是我发布的完整代码。
感谢大家的时间。
答案 0 :(得分:2)
编辑:Woops,对不起,我没有看到你正在使用WCF,因为我认为WebAPI在这里会好的(关于你的问题到web api和引用你的问题)。但也许您不需要坚持使用WCF并可以使用其他技术?
Marek,请再次查看https://stackoverflow.com/a/18271995/959687,了解基础知识。我正在编写以下代码,因此可能需要在之后进行改进。但它会告诉你它是如何基本完成的。
我将向您展示如何使用来自Web服务的项填充LongListSelector。
首先,我们需要数据传输对象(DTO):
[JsonObject]
public class ListDTO
{
[JsonProperty]
public IEnumerable<string> Items { get; set; }
}
然后你需要一个控制器:
public class ListController : ApiController
{
[HttpGet]
public ListDTO Get()
{
return new ListDTO()
{
Items = new List<string>()
{
"Item 1",
"Item 2",
},
};
}
}
然后,您需要从应用中的服务中检索这些项目:
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
LoadFromWebservice();
}
private async void LoadFromWebservice()
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://thewebservice.tld/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
await client.GetStreamAsync("api/list/get")
.ContinueWith(result =>
{
var stream = result.Result;
var serializer = new JsonSerializer(); // this is json.net serializer
using (var streamReader = new StreamReader(stream))
{
using (var jsonReader = new JsonTextReader(streamReader))
{
var theList = serializer.Deserialize<ListDTO>(jsonReader);
Dispatcher.BeginInvoke(() => LLS.ItemsSource = theList.Items.ToList());
}
}
});
}
现在,您可以使用数据库中的ling-to-sql在控制器中检索项目。无论你想要什么,随意做。 : - )
但请注意:我不建议这样做,因为它太多地耦合到您的用户界面。此示例向您展示了从Web服务获取数据的基础知识。
我建议你看一下MVVM模式(http://en.wikipedia.org/wiki/Model_View_ViewModel),构建一个viewmodel并将你的视图绑定到那个viewmodel。这样做的一种方法是使用MVVM灯:http://mvvmlight.codeplex.com/
其他信息