Frage

Ich habe eine Bestellung Details Form in Silverlight bekommt, die ein listbox Ordnungszahlung hat. Die Auftrags Zahlungen werden auf ihre eigenen Domain-Datenquelle außerhalb der umgebenden Bestellung gebunden. Ich habe eine Schaltfläche, das erscheint eine Childwindow Kontrolle neue Auftrag Zahlungen hinzuzufügen. Eine Bestellung Zahlung hat einen Betrag und eine Zahlungsmethode mit ihm verbunden ist.

Die Form lädt fein, zeigt alle Zahlungsmethoden in einem Datenform in einem Drop-Down zusammen mit dem Textfeld für die Menge. Als ich den Auftrag Zahlung speichern und versuchen, es auf die Reihenfolge wieder befestigen Details Bestellung Zahlungen Datenquelle, erhalte ich das gefürchtete ‚Entity kann nicht angebracht werden, da sie bereits an einen anderen Unternehmen gebunden ist‘ Fehler.

Hier ist der XAML für das Add Bestellung Zahlung Kind Fenster:

<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>

Hier ist der Code hinter für den Add-Bestellung Zahlung Bildschirm:

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;
    }

Schließlich, hier ist der Code, der versucht, die neue Ordnung Zahlung an den Auftrag wieder zu befestigen Screen Details:

 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();
        }
    }

Bin ich in dieses Problem laufen, weil die Bestellung Zahlung eine Eigenschaft hat, die auf einen anderen Datenkontext gebunden ist? Kann ich auch ein Kind Objekt auf diese Weise, da hinzufügen, dass das Kind-Objekt zu laden Objekte von RIA Dienstleistungen hat, um für sie gespeichert werden? Sollte ich passieren irgendwie die domaindatasource von der Bestelldaten Seite, um das Kind Kontrolle einer Datenquelle zu haben? Oder muss ich tun um einen Klon in Code wiederherstellen haben ein neues Objekt zu bekommen?

War es hilfreich?

Lösung

Ich würde empfehlen, den Domaincontext aus dem übergeordneten Fenster passieren (die Sie in add_Closed verwenden), um das Fenster Kind und verwenden Sie dann, dass Domaincontext in Ihrem DomainDataSource (paymentMethodsSource). Auf diese Weise alle Entitäten werden in den gleichen Kontext geladen. Ein alternativer Ansatz wäre die Abfrage (GetPaymentMethods) in dem übergeordneten Fenster zu tun, um den Kontext zu dem Kind Fenster passieren, und nur bindet die ListBox.ItemsSource zu CPSDomainContext.PaymentMethods in Ihrem Kind Fenster.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top