إضافة كيان من نافذة الطفل يسبب كيان لا يمكن إرفاق خطأ ... لماذا؟

StackOverflow https://stackoverflow.com/questions/3728673

سؤال

لدي نموذج تفاصيل الطلب في Silverlight يحتوي على قائمة مدفوعات الطلبات. ترتبط مدفوعات الطلب بمصادقة بيانات المجال الخاصة بها خارج الطلب المحيط. لدي زر ينبثق عن تحكم في الريف للأطفال لإضافة مدفوعات طلب جديدة. مدفوعات الطلب لها مبلغ وطريقة دفع مرتبطة به.

يتم تحميل النموذج بشكل جيد ، ويعرض جميع طرق الدفع في DataForm في القائمة المنسدلة مع مربع النص للمبلغ. عندما أقوم بحفظ دفعة الطلب وأحاول إرفاقه بمصادر بيانات مدفوعات تفاصيل الطلب ، لا يمكن إرفاق الكيان المروع لأنه مرتبط بالفعل بخطأ كيان آخر.

إليك XAML لإضافة نافذة ADD ORDER Payment Child:

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

إليك الرمز وراء شاشة دفع الطلب:

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 بطريقة أو بأخرى من صفحة تفاصيل الطلب إلى عنصر تحكم الطفل للحصول على بيانات بيانات واحدة؟ أو هل يجب علي العودة إلى عمل استنساخ في الكود للحصول على كائن جديد؟

هل كانت مفيدة؟

المحلول

أوصي بتمرير DomainContext من النافذة الأصل (تلك التي تستخدمها في Add_closed) إلى نافذة الطفل ثم استخدم هذا domainContext في DomainDataSource (PaymentMethodsSource). وبهذه الطريقة يتم تحميل جميع الكيانات في نفس السياق. تتمثل المقاربة البديلة في إجراء الاستعلام (getPaymentMethods) في النافذة الأصل ، وتمرير السياق إلى النافذة الفرعية ، وربط listbox.itemsource فقط إلى cpdomaincontext.paymentMethods في نافذة طفلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top