J'ai un formulaire de détails de commande dans Silverlight qui a une liste de paiements de commande. Les paiements de commande sont liés à leur propre source de données de domaine en dehors de l'ordre environnant. J'ai un bouton qui ouvre un contrôle ChildWindow pour ajouter de nouveaux paiements de commande. Un paiement de commande a un montant et une méthode de paiement associée. Le formulaire se charge bien, affiche toutes les méthodes de paiement dans un formulaire de données dans une liste déroulante avec la zone de texte pour le montant.Ajouter une entité à partir de la fenêtre enfant causes Entité ne peut pas être joint erreur .... pourquoi?
Lorsque j'économise le paiement de la commande et que j'essaie de le rattacher aux détails de la commande Commander la source de données Paiements, j'obtiens la redoutée erreur «L'entité ne peut pas être jointe car elle est déjà attachée à une autre entité».
Voici le XAML pour la fenêtre enfant Commander Ajouter Paiement:
<controls:ChildWindow.Resources>
<riaControls:DomainDataSource x:Key="paymentMethodsSource" QueryName="GetPaymentMethods" AutoLoad="True">
<riaControls:DomainDataSource.DomainContext>
<ds:CPSDomainContext />
</riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>
</controls:ChildWindow.Resources>
<dataForm:DataForm x:Name="addOrderPaymentDataForm" AutoGenerateFields="False" AutoCommit="True" AutoEdit="True" CommandButtonsVisibility="None">
<dataForm:DataForm.EditTemplate>
<DataTemplate>
<StackPanel>
<dataForm:DataField Label="Payment Method">
<ListBox ItemsSource="{Binding Data, Source={StaticResource paymentMethodsSource}}"
DisplayMemberPath="Name"
SelectedItem="{Binding PaymentMethod, Mode=TwoWay}"
SelectionMode="Single"/>
</dataForm:DataField>
<dataForm:DataField Label="Amount">
<TextBox Text="{Binding Amount, Mode=TwoWay}" />
</dataForm:DataField>
</StackPanel>
</DataTemplate>
</dataForm:DataForm.EditTemplate>
</dataForm:DataForm>
Voici le code derrière pour l'écran Ajouter ordre de paiement:
public AddOrderPaymentWindow() {
InitializeComponent();
NewOrderPayment = new OrderPayment();
addOrderPaymentDataForm.CurrentItem = NewOrderPayment;
addOrderPaymentDataForm.BeginEdit();
}
public OrderPayment NewOrderPayment { get; set; }
private void OKButton_Click(object sender, RoutedEventArgs e) {
NewOrderPayment.CreatedBy = "jkandiko";
NewOrderPayment.CreatedOn = DateTime.Now;
NewOrderPayment.ModifiedBy = "jkandiko";
NewOrderPayment.ModifiedOn = DateTime.Now;
var result = addOrderPaymentDataForm.CommitEdit();
this.DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e) {
NewOrderPayment = null;
addOrderPaymentDataForm.CancelEdit();
this.DialogResult = false;
}
Enfin, est le code ici qui tente de refixer le nouveau paiement de la commande aux détails de la commande écran:
void add_Closed(object sender, EventArgs e) {
AddOrderPaymentWindow pay = (AddOrderPaymentWindow)sender;
if (pay.NewOrderPayment != null) {
Administration.Web.Services.CPSDomainContext context = (CPSDomainContext)orderPaymentDataGridSource.DomainContext;
context.OrderPayments.Add(pay.NewOrderPayment);
context.SubmitChanges();
}
}
Suis-je en cours d'exécution i n à ce problème parce que le paiement d'ordre a une propriété liée à un contexte de données différent? Puis-je même ajouter un objet enfant de cette manière, étant donné que l'objet enfant doit charger des objets à partir de services RIA pour qu'il soit sauvegardé? Dois-je passer en quelque sorte la domaindatasource de la page des détails de la commande au contrôle enfant pour avoir une source de données? Ou dois-je revenir à faire un clone dans le code pour obtenir un nouvel objet?