0

У меня есть форма заказа в Silverlight, у которого есть список заказов. Платежи заказа привязаны к собственному источнику данных домена за пределами окружения. У меня есть кнопка, которая выдает элемент управления ChildWindow для добавления новых платежей. У оплаты заказа есть сумма и способ оплаты, связанные с ним.Добавление объекта из дочернего окна приводит к тому, что объект не может быть прикреплен к ошибке .... почему?

Форма загружается штрафом, отображает все способы оплаты в форме данных в выпадающем меню вместе с текстовым полем для суммы. Когда я сохраняю платеж по заказу и пытаюсь прикрепить его к деталям заказа. Платежный источник данных оплаты, я получаю страшное «Объект не может быть прикреплен, потому что он уже привязан к другой сущности».

Вот XAML для оплаты детского окна Add Order:

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

Вот код позади на экране Add платежного поручения:

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

Наконец, вот код, который пытается присоединить новый заказ на экран сведений о заказе:

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 к этой проблеме, потому что у Платежа заказа есть свойство на нем, которое связано с другим контекстом данных? Могу ли я даже добавить дочерний объект таким образом, учитывая, что дочерний объект должен загружать объекты из служб RIA для их сохранения? Должен ли я каким-либо образом передать domaindatasource со страницы данных заказа на дочерний элемент управления, чтобы иметь один источник данных? Или мне нужно вернуться к выполнению клонирования в коде, чтобы получить новый объект?

ответ

1

Я бы рекомендовал вам передать DomainContext из родительского окна (того, которое вы используете в add_Closed) в дочернее окно, а затем использовать этот DomainContext в вашем DomainDataSource (paymentMethodsSource). Таким образом, все объекты загружаются в один и тот же контекст. Альтернативным подходом было бы сделать запрос (GetPaymentMethods) в родительском окне, передать контекст дочернему окну и просто привязать ListBox.ItemsSource к CPSDomainContext.PaymentMethods в вашем дочернем окне.

Смежные вопросы