Windows Phone 8.1 verbindliche Daten an XAML aus Datenquelle (HUB-Vorlage) - c #, Xaml, Windows-Phone-8, Windows-Phone-8.1

Ich brauche Hilfe...

Im Wesentlichen habe ich WP 8.1 Entwicklungs-Tutorials angeschaut und es gab ein Tutorial mit der Standard-HUB-Vorlage.

Also habe ich versucht, diese Vorlage für mich selbst zu konfigurierenbenutzen. Ich habe eine JSON-Datei mit allen Daten, die ich brauche (Wohnungen), die ich jetzt auf meiner Seite auflisten möchte. Ich habe die SampleDataSource, die in meiner App nur DataSource ist, "neu erstellt". Ich denke, alles ist in Ordnung mit den Daten und jetzt kommt das Problem mit der Übersetzung dieser Daten und der Bindung an XAML. Ich weiß nicht wirklich, warum es nicht funktioniert, da ich gerade versucht habe, die Parameter zu ändern, die in der Vorlage funktionieren (vom SDK bereitgestellt). Könnt ihr mir helfen oder mir ein paar Anweisungen geben, wo ich ein Beispiel dafür finden kann?

Wenn jemand bereit wäre zu helfen oder skype / TWMit mir, um mir die Struktur und das, was ich zu tun habe, zu zeigen, wäre ich dankbar, wenn ich dann wissen würde, wie das im Grunde übersetzt und funktioniert, damit ich an anderen Teilen des Projekts arbeiten kann! Habe Bitcoins als Belohnung! :)

Danke im Voraus.

EDIT: Hinzufügen Github Repo: https://github.com/lklancir/zimmerfrei_wp/tree/master/ZimmerFrei_v0.1

Hier ist die DataSource.cs:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Data.Json;
using Windows.Storage;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;

Namensraum ZimmerFrei.Data {

public class ApartmentData
{
public ApartmentData(String id, String name, String description, String capacity, String stars, String address, String email, String phone, String phone2, String rating, String lat, String lng, String price, String cover_photo, String owner_id, String type_id, String city_id)
{
this.Id = id;
this.Name = name;
this.Description = description;
this.Capacity = capacity;
this.Stars = stars;
this.Address = address;
this.Email = email;
this.Phone = phone;
this.Phone2 = phone2;
this.Rating = rating;
this.Lat = lat;
this.Lng = lng;
this.Price = price;
this.Cover_photo = cover_photo;
this.Owner_id = owner_id;
this.Type_id = type_id;
this.City_id = city_id;


}

public string Id { get; private set; }
public string Name { get; private set; }
public string Description { get; private set; }
public string Capacity { get; private set; }
public string Stars { get; private set; }
public string Address { get; private set; }
public string Email { get; private set; }
public string Phone { get; private set; }
public string Phone2 { get; private set; }
public string Rating { get; private set; }
public string Lat { get; private set; }
public string Lng { get; private set; }
public string Price { get; private set; }
public string Cover_photo { get; private set; }
public string Owner_id { get; private set; }
public string Type_id { get; private set; }
public string City_id { get; private set; }

public override string ToString()
{
return this.Name;
}
}



public sealed class DataSource
{
private static DataSource _dataSource = new DataSource();

private ObservableCollection<ApartmentData> _apartments = new ObservableCollection<ApartmentData>();

public ObservableCollection<ApartmentData> Apartments
{
get { return this._apartments; }
}

public static async Task<IEnumerable<ApartmentData>> GetApartmentsAsync()
{
await _dataSource.GetDataAsync();

return _dataSource.Apartments;
}

public static async Task<ApartmentData> GetApartmentAsync(string id)
{
await _dataSource.GetDataAsync();
var matches = _dataSource.Apartments.Where((apartment) => apartment.Id.Equals(id));
if (matches.Count() == 1) return matches.First();
return null;
}



private async Task GetDataAsync()
{
if (this._apartments.Count != 0)
return;

Uri dataUri = new Uri("ms-appx:///DataModel/Apartments.json");
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(dataUri);
string jsonText = await FileIO.ReadTextAsync(file);
JsonObject jsonObject = JsonObject.Parse(jsonText);
JsonArray jsonArray = jsonObject["apartments"].GetArray();

foreach (JsonValue apartmentValue in jsonArray)
{
JsonObject apartmentObject = apartmentValue.GetObject();
ApartmentData apartment = new ApartmentData(apartmentObject["Id"].GetString(),
apartmentObject["Name"].GetString(),
apartmentObject["Description"].GetString(),
apartmentObject["Capacity"].GetString(),
apartmentObject["Stars"].GetString(),
apartmentObject["Address"].GetString(),
apartmentObject["Email"].GetString(),
apartmentObject["Phone"].GetString(),
apartmentObject["Phone2"].GetString(),
apartmentObject["Rating"].GetString(),
apartmentObject["Lat"].GetString(),
apartmentObject["Lng"].GetString(),
apartmentObject["Price"].GetString(),
apartmentObject["Cover_photo"].GetString(),
apartmentObject["Owner_id"].GetString(),
apartmentObject["Type_id"].GetString(),
apartmentObject["City_id"].GetString());

this.Apartments.Add(apartment);
}
}
}

}

Hier ist das ListPage.xaml (wo ich meine Daten schreiben möchte)

<Page
x:Class="ZimmerFrei_v0._1.ListPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ZimmerFrei_v0._1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:data="using:ZimmerFrei.Data"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
d:DataContext="{Binding Source={d:DesignData Source=/DataModel/Apartments.json, Type=data:DataSource}}"
mc:Ignorable="d" FontFamily="Global User Interface">


<Page.Resources>


<DataTemplate x:Key="StandardTripleLineItemTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<Border Background="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}" Margin="0,9.5,0,0" Grid.Column="0" HorizontalAlignment="Left">
<Image Source="{Binding Cover_photo}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}" Height="79" Width="79"/>
</Border>
<StackPanel Grid.Column="1" Margin="14.5,0,0,0">
<TextBlock Text="{Binding Name}" Style="{ThemeResource ListViewItemTextBlockStyle}" FontFamily="Global User Interface"/>
<TextBlock Text="{Binding Description}" Style="{ThemeResource ListViewItemContentTextBlockStyle}" Foreground="{ThemeResource PhoneMidBrush}" FontFamily="Global User Interface" />
<TextBlock Text="{Binding Stars}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" />
</StackPanel>
</Grid>
</DataTemplate>

</Page.Resources>

<Grid x:Name="LayoutRoot">
<Hub x:Name="Hub" x:Uid="Hub" Header="ZimmerFrei">

<HubSection x:Uid="HubSection" Header="APARTMENTS"
DataContext="{Binding Apartments}" >
<DataTemplate>
<ListView
AutomationProperties.AutomationId="ItemListViewSection3"
AutomationProperties.Name="Items In Group"
SelectionMode="None"
IsItemClickEnabled="True"
ItemsSource="{Binding apartment}"
ItemTemplate="{StaticResource StandardTripleLineItemTemplate}"
ItemClick="ItemView_ItemClick"
ContinuumNavigationTransitionInfo.ExitElementContainer="True">
</ListView>
</DataTemplate>
</HubSection>
</Hub>
</Grid>

Bildbeschreibung hier eingeben

Antworten:

1 für die Antwort № 1

Es gibt ein paar Probleme hier:

  • Ihre ApartmentData Klasse hat einige Eigenschaften, die wie folgt benannt werden Cover_photo. Dies ist normalerweise nicht die von C # verwendete Stilkonvention, daher habe ich sie in like umbenannt CoverPhoto.
  • Zum selben Thema, dein ApartmentData Eigenschaften werden wie folgt benannt Cover_photo aber sie sind wie genannt cover_photo im JSON (was ein typischer JSON-Stil ist). Sie greifen folgendermaßen auf die JSON-Schlüssel zu:

    apartmentObject["Cover_photo"].GetString()  // KeyNotFoundException
    

    aber es sollte sein:

    apartmentObject["cover_photo"].GetString()
    

    Dies funktioniert während der Laufzeit, aber Der Designer wird diesen Code nicht ausführen.Der Designer liest die JSON-Datei und versucht, Schlüssel in der JSON-Datei mit Eigenschaften des von Ihnen angegebenen Typs abzugleichen. Dies ist jedoch nicht möglich, da die Schlüssel und Eigenschaften nicht übereinstimmen. Also entweder du:

    1. Ändern Sie den JSON so, dass die Schlüssel den Eigenschaften wie entsprechen CoverPhoto.
    2. Notieren Sie Ihren Typ mit dem DataContractAttribute. Dadurch können Sie die Zuordnung zwischen JSON- und .NET-Typ mit angeben DataMemberAttribute, aber hauptsächlich, weil Sie JSON-Serialisierung / Deserialisierung erhalten!

Ich habe Ihnen eine Pull-Anfrage mit diesen Änderungen gesendet. Außerdem sind Ihre Designdaten riesig (~ 1000 Artikel!). Es sollte nur ~ 5 Elemente enthalten, da Sie sowieso nicht alle Elemente im Designer sehen können.


Verwandte Fragen
Speisekarte