子のウィンドウからエンティティを追加すると、エンティティを添付できません…なぜ?
-
03-10-2019 - |
質問
Silverlightに注文の詳細フォームがあり、注文支払いのリストボックスがあります。注文の支払いは、周囲の注文の外側の独自のドメインデータソースに拘束されます。 ChildWindowコントロールをポップアップして新しい注文支払いを追加するボタンがあります。注文支払いには、それに関連する金額と支払い方法があります。
フォームは正常にロードされ、ドロップダウンのデータフォームにすべての支払い方法が表示され、金額のテキストボックスが表示されます。注文支払いを保存して注文詳細に戻してください。
ADD注文の子ウィンドウのXAMLは次のとおりです。
<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();
}
}
注文支払いには、別のデータコンテキストに縛られているプロパティがあるため、この問題に遭遇していますか?子オブジェクトがRIAサービスからオブジェクトを保存するためにオブジェクトをロードする必要があることを考えると、この方法で子オブジェクトを追加することもできますか?どういうわけか、DomainDataSourceを注文の詳細ページから子のコントロールに渡して、1つのデータソースを持つ必要がありますか?または、新しいオブジェクトを取得するためにコードのクローンを実行することに戻す必要がありますか?
解決
DomainContextを親ウィンドウ(Add_Closedで使用するもの)からChild Windowに渡してから、DomainDataSource(PayuneMethodsSource)でそのドメインコンテキストを使用することをお勧めします。そうすれば、すべてのエンティティが同じコンテキストにロードされています。別のアプローチは、親ウィンドウでクエリ(getPaymentMethods)を実行し、CompentをChild Windowに渡し、ListBox.ItemsSourceをCPSDOMAINCONTEXT.PAYMENTMETHODSにバインドすることです。