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