سؤال

في صفحة برنامج الأغذية العالمي أن أنا تصميم لكنيستي، ولدي عنصري تحكم مربع القائمة منضما إلى نتائج دراستين الاستفسارات ينق إلى كيانات: يحتوي مربع القائمة الأول / الاستعلام عن الناس الذين لم تعهد حتى الآن طريقة ل السنة، مربع القائمة الثانية / استعلام يحتوي على جميع الناس الذين تعهدوا (والتعهدات المرتبطة بها). على وجه التحديد:

var familiesWithNoPledges = from family in entities.Family.Include("Pledge")
    where !family.Pledge.Where(p => p.PledgeYearID == pledgeYear).Any()
    select family;

var familiesWithPledges = from family in entities.Family
    join pledge in entities.Pledge.Include("PledgeFrequency").Where(p => p.PledgeYearID == pledgeYear) on family equals pledge.Family
    select new { family, pledge };

وعندما يحدد المستخدم لتطبيق عائلة من مربع القائمة الأولى، هذا البند مربع القائمة يتوسع قليلا لإظهار الحقول لالتعهد، بحيث أنه من السهل أن إضافة تفاصيل تعهد إلى مربع القائمة الثانية. يبدو شيئا من هذا القبيل:

http://wouldbetheologian.com/images/PledgeManager.jpg (خارج الموقع صورة)

وقاعدة البيانات الأساسية (بين أمور أخرى) لديها "العائلة" الجدول مع 1: العلاقة عديدة إلى جدول "التعهد". وعندما يقوم المستخدم بالنقر فوق الزر "إضافة التعهد"، أود أن إنشاء المثيل التعهد الجديد، حفظه إلى قاعدة البيانات، ثم قم بتحديث الضوابط اثنين.

ولكن لا أستطيع معرفة كيفية القيام بذلك. إذا كنت تحاول أن تفعل ذلك في التعليمات البرمجية الخلفية، فإنه لا يبدو مثل معالج الحدث ل(ن الحالات لل) "إضافة التعهد" زر يمكن الرجوع عناصر التحكم في المسألة؛ وفي XAML، إذا حاولت ربط الضوابط ListBoxItem DataTemplate إلى Family.Pledge (أو Family.Pledge.FirstOrDefault ()) الحقول، تلك الحقول لا تزال فارغة عندما ألقي نظرة على وجوه الأسرة الحالية في معالج الأحداث لإضافة تعهد زر.

وأية أفكار حول كيفية حل هذا؟ أو هل هناك نموذج UI أفضل وأود أن ننظر تماما؟

وشكرا مقدما.

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

المحلول 2

شكرا، أندرو، الذي فعل ذلك. كان المفتاح الذي كان لي لإنشاء DataContext منفصل لDockPanel في السؤال، ومن ثم ملزمة لها مثيل جديد من وجوه تعهد إنشاؤها على مستوى اعلى في القالب.

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.Resources>
                    <local:Pledge x:Key="pledge" />
                </Grid.Resources>

                <DockPanel DataContext="{Binding Source={StaticResource pledge}}" >
                    <TextBox Name="txtAmount" Text="{Binding Path=Amount}" />
                    <TextBox Name="txtEnvelopeID" Text="{Binding Path=EnvelopeID}" />
                    <!-- Bind the Tag property of the Button to the DataContext of the ListBoxItem, i.e.  the current Family object -->
                    <Button Tag="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext}" Name="addPledge" Click="addPledge_Click"  >
                        Add Pledge -->
                    </Button>
                </DockPanel>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

وأنا لا تزال هناك حاجة لمعرفة المزيد من التفاصيل لإعداد الاعتراض التعهد بشكل مناسب، لكني لم اكن قادرة على الحصول عليها عن طريق ربط خاصية العلامات زر إلى DataContext من الأم قالب:

<Button 
    Tag="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext}" 
    Name="addPledge" 
    Click="addPledge_Click" 
/>

ومن هناك، وكنت قادرة على التعامل مع الباقي في التعليمات البرمجية الخلفية:

    private void addPledge_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            // Set any additional necessary properties.
            Button button = (Button)sender;
            Pledge pledge = (Pledge)button.DataContext;
            pledge.PledgeYear = (PledgeYear)cboYear.SelectedItem;
            pledge.Family = (Family)button.Tag;

            // Update the database and refresh the Listboxes.
            entities.AddToPledge(pledge);
            entities.SaveChanges();
            LoadUnpledgedListBox();
            LoadPledgedListBox();
        }
        catch (System.Data.UpdateException ex)
        {
            MessageBox.Show("Error updating database: " + ex.Message);
        }
        catch (System.Exception ex)
        {
            Classes.Utils.HandleGenericError(ex);
        }
    }

وشكرا جزيلا - أن أشار لي في الاتجاه الصحيح

نصائح أخرى

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

    private void AddPledge_Click(object sender, RoutedEventArgs e)
    {
        Button b = sender as Button;
        PotentialPledge p = b.DataContext as PotentialPledge;

        //do stuff with pledge
    }

قد يكون هناك طريقة للقيام بذلك دون الحاجة حقول قالب تكون جزءا من الطبقة التي تشكل ItemsSource لمربع القائمة (مجرد تعلم WPF نفسي)، ولكن هذا يعمل. وإذا كان هذا لا يساعد، سوف ننظر إلى الوراء في وقت لاحق (خارج للعمل الآن).

وعلى أي حال، وظيفة رهيبة مما يجعل التطبيق لكنيستك، انها تبدو جيدة جدا.

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