簡體   English   中英

LongListSelector關於WP8 LINQ到SQL的綁定問題

[英]LongListSelector on WP8 linq-to-sql binding issue

我正在構建我的第一個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>

很抱歉提供這么大的代碼,但到目前為止我還不知道錯誤可能出在哪里,所以我發布了完整的代碼。

謝謝大家的寶貴時間。

編輯 :糟糕,很抱歉,我沒有讀到您正在為此使用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 ),構建一個視圖模型並將視圖綁定到該視圖模型。 一種方法是使用MVVM light: http : //mvvmlight.codeplex.com/

附加信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM