J'ai un cadre d'entité avec une relation plusieurs-à-plusieurs entre les clients et les contacts.Problème avec la liaison de données dans xaml via un service de domaine RIA
J'ai généré une classe de service de domaine et ajouté manuellement la méthode suivante.
public Customer GetCustomerById(int Id)
{
return this.ObjectContext.Customer.Include("Contacts").SingleOrDefault(s => s.Id == Id);
}
Je veux maintenant créer une page qui me montre les détails du client et une liste de contacts associés à ce client.
Je suis ce qui suit dans codebehind du clientdetails.xaml pour lire le paramètre Id qui est passé dans la page.
public int CustomerId
{
get { return (int)this.GetValue(CustomerIdProperty); }
set { this.SetValue(CustomerIdProperty, value); }
}
public static DependencyProperty CustomerIdProperty = DependencyProperty.Register("CustomerId", typeof(int), typeof(CustomerDetails), new PropertyMetadata(0));
// Executes when the user navigates to this page.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (this.NavigationContext.QueryString.ContainsKey("Id"))
{
CustomerId = Convert.ToInt32(this.NavigationContext.QueryString["Id"]);
}
}
J'utilise le XAML suivant pour la page:
<Grid x:Name="LayoutRoot" DataContext="{Binding ElementName=customerByIdSource, Path=Data}">
<riaControls:DomainDataSource Name="customerByIdSource" AutoLoad="True" QueryName="GetCustomerById">
<riaControls:DomainDataSource.QueryParameters>
<riaControls:Parameter ParameterName="Id" Value="{Binding ElementName=CustomerDetailsPage, Path=CustomerId}" />
</riaControls:DomainDataSource.QueryParameters>
<riaControls:DomainDataSource.DomainContext>
<sprint:Customer2DomainContext/>
</riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>
<StackPanel x:Name="CustomerInfo" Orientation="Vertical">
<StackPanel Orientation="Horizontal" Margin="3,3,3,3">
<TextBlock Text="Id"/>
<TextBox x:Name="idTextBox" Text="{Binding Id}" Width="160"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="3,3,3,3">
<TextBlock Text="Name"/>
<TextBox x:Name="nameTextBox" Text="{Binding Name}" Width="160"/>
</StackPanel>
<ListBox ItemsSource="{Binding Contact}" DisplayMemberPath="FullName" Height="100" />
</StackPanel>
</Grid>
Quand je fais les zones de texte se faire joliment peuplé par la liaison de données, mais le reste vide listbox.
Deux questions:
Puis-je spécifier en quelque sorte le retour type de la requête GetCustomerById, donc je peux voir les noms quand je précise la liaison à travers l'interface graphique propriétés?
Qu'est-ce que je fais tort ici? Pourquoi mon ListBox n'est pas rempli? Est-ce que je vais le faire de la bonne manière ou dois-je aussi définir la liaison de données pour la liste dans codebehind? Si c'est le cas, comment? Je n'ai pas trouvé comment accéder par programme à la propriété Contacts via la source de données de domaine.
J'utilise silverlight et Entity Framework 4.