关于WP8 linq到sql绑定问题的LongListSelector

本文关键字:问题 LongListSelector 绑定 sql WP8 linq 关于 | 更新日期: 2023-09-27 18:27:43

我正在构建我的第一个WP8应用程序,该应用程序通过linq连接到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;
        }
    }

t

这是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>

很抱歉提供了这么大的代码,但由于到目前为止我还不知道错误可能在哪里,我发布了完整的代码。

感谢大家抽出时间。

关于WP8 linq到sql绑定问题的LongListSelector

编辑:哇,很抱歉,我没有读到你正在使用WCF,因为我认为WebAPI在这里可以(关于你对WebAPI的问题,并在这里引用你的问题)。但也许您不需要坚持使用WCF,可以使用其他技术?

马雷克,请看一下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),构建一个视图模型并将您的视图绑定到该视图模型。一种方法是使用MVVM灯光:http://mvvmlight.codeplex.com/

附加信息

  • 如果您想在本地机器上进行测试,请查看此处:http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj684580%28v=vs.105%29.aspx
  • 要使用httpclient,您需要从NuGet安装软件包
  • 为了部署它的解决方案,让每个人都可以访问它,你需要一个运行.NET 4.5的Web空间,创建一个部署包(http://msdn.microsoft.com/en-us/library/dd465323.aspx)并上传到您的服务器
  • 为了访问您的MS SQL数据库,您可以使用ling-to-SQL、实体框架或.NET支持的任何其他方法