У меня есть форма сведений о заказе в Silverlight, в которой есть список платежей по заказам.Платежи заказа связаны с их собственным источником данных домена за пределами окружающего заказа.У меня есть кнопка, которая открывает элемент управления ChildWindow, чтобы добавить новые платежи заказа.Оплата заказа имеет сумму и способ оплаты, связанный с ней.
Форма загружается нормально, отображает все способы оплаты в форме данных в раскрывающемся списке вместе с текстовым полем для суммы.Когда я сохраняю оплату заказа и пытаюсь прикрепить его обратно к источнику данных «Заказы на оплату заказа», я получаю страшное «Объект не может быть присоединен, поскольку он уже связан с ошибкой другого объекта».
Вот XAML для дочернего окна Add Order Payment:
<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 Order Payment:
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();
}
}
Я сталкиваюсь с этой проблемой, потому что у оплаты заказа есть свойство, связанное с другим контекстом данных?Могу ли я даже добавить дочерний объект таким образом, учитывая, что дочерний объект должен загружать объекты из служб RIA для его сохранения?Должен ли я как-то передать источник данных domaindatasource со страницы сведений о заказе дочернему элементу управления, чтобы иметь один источник данных?Или я должен вернуться к выполнению клона в коде, чтобы получить новый объект?