Domanda

Ho un modulo dettagli dell'ordine in Silverlight che ha una casella di riepilogo dei pagamenti di ordine. I pagamenti di ordine sono tenuti a loro dominio di origine dati al di fuori dell'ordine circostante. Ho un pulsante che si apre un controllo childWindow per aggiungere nuovi pagamenti di ordine. Un pagamento di ordine ha una quantità e un metodo di pagamento associato.

Il modulo viene caricato bene, visualizza tutti i metodi di pagamento in una DataForm in una discesa lungo con la casella di testo per l'importo. Quando salvo il pagamento di ordine e cercare di attaccarlo di nuovo all'ordine dettagli dell'ordine Pagamenti origine dati, ottengo il temuto 'Ente non può essere attaccato perché è già collegato a un altro soggetto' errore.

Ecco il codice XAML per la finestra secondaria di pagamento aggiungere l'ordine:

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

Ecco il codice dietro per la schermata aggiungere l'ordine di pagamento:

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

Infine, ecco il codice che tenta di ricollegare il nuovo pagamento per l'ordine Dettagli schermo:

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

I Am in esecuzione in questo problema perché l'ordine di pagamento ha una proprietà su di esso che è legato a un contesto dati diverso? Posso aggiungere anche un oggetto figlio in questo modo, dato che l'oggetto figlio ha a oggetti di carico da servizi RIA in modo che esso per essere salvato? Devo in qualche modo passare il domaindatasource dalla pagina dei dettagli dell'ordine per il controllo figlio di avere uno datasource? O devo tornare a fare un clone in codice per ottenere un nuovo oggetto?

È stato utile?

Soluzione

mi consiglia di passare il DomainContext dalla finestra padre (quello che si usa in add_Closed) per la finestra secondaria e quindi utilizzare tale DomainContext nel DomainDataSource (paymentMethodsSource). In questo modo tutte le entità vengono caricati nello stesso contesto. Un approccio alternativo sarebbe quello di fare la query (GetPaymentMethods) nella finestra principale, passare il contesto per la finestra secondaria, ed appena si legano il ListBox.ItemsSource per CPSDomainContext.PaymentMethods nella vostra finestra secondaria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top