Question

J'ai un formulaire de détails de la commande dans Silverlight qui a une zone de liste des paiements d'ordre. Les paiements d'ordre sont liés à leur propre domaine extérieur de la source de données pour ses environs. J'ai un bouton qui apparaît un contrôle ChildWindow d'ajouter de nouveaux paiements d'ordre. Un paiement de la commande a une quantité et un mode de paiement associé.

La forme des charges fines, affiche toutes les méthodes de paiement dans un groupe de données dans un menu déroulant avec la zone de texte pour le montant. Lorsque j'enregistre le paiement de la commande et essayer de le joindre de nouveau à l'ordre Détails de la commande Paiements source de données, je reçois la redoutée « entité ne peut pas être joint car il est déjà attaché à une autre entité » erreur.

Voici le XAML pour la commande d'ajout fenêtre enfant de 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 la commande d'ajout écran 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, voici le code qui tente de replacer le nouveau paiement de la commande à l'ordre écran Détails:

 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 dans ce problème parce que le paiement de la commande a une propriété sur ce qui est lié à un contexte de données différentes? Puis-je ajouter même un objet enfant de cette façon, étant donné que l'objet enfant à des objets de charge des services RIA afin qu'il soit sauvé? Dois-je passer en quelque sorte le DomainDataSource de détails de la commande page au contrôle de l'enfant d'avoir une source de données? Ou dois-je revenir à faire un clone dans le code pour obtenir un nouvel objet?

Était-ce utile?

La solution

Je vous recommande de passer la DomainContext de la fenêtre parent (celui que vous utilisez dans add_Closed) à la fenêtre enfant, puis utilisez cette DomainContext dans votre DomainDataSource (paymentMethodsSource). De cette façon, toutes les entités sont chargées dans le même contexte. Une autre approche serait de faire la requête (GetPaymentMethods) dans la fenêtre parent, passez le contexte à la fenêtre de l'enfant, et juste lier la ListBox.ItemsSource à CPSDomainContext.PaymentMethods dans la fenêtre de votre enfant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top