سؤال

وأنا بناء تطبيق باستخدام نمط تحكم الإشراف (نموذج عرض مقدم) وأواجه صعوبة. في صفحتي لدي السيطرة مكرر التي سيتم عرض كل عنصر من مجموعة أنا يمر بها. ويتضمن هذا البند reapeater 2 القائمة المنسدلة التي تسمح للمستخدم لتحديد قيمة معينة. عندما اضغط على زر التالي، وأنا أريد وحدة تحكم لاسترداد تلك القيم.

وكيف يمكنني أن أفعل ذلك أنا وسيلة نظيفة؟

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

المحلول

ويمكنك أيضا جعل واجهة "القطعة" لالمنسدلة. سأعطيك مثالا من السهل على بعض التعليمات البرمجية العمل لتطبيق مصغر مربع نص حتى تحصل على هذه الفكرة.

public interface ITextWidget
{
    event EventHandler TextChanged;
    string Text { get; set; }
}

public abstract class TextWidget<T> : ITextWidget
{

    protected T _wrappedWidget { get; set; }
    public event EventHandler TextChanged;

    protected void InvokeTextChanged(object sender, EventArgs e)
    {
        var textChanged = TextChanged;
        if (textChanged != null) textChanged(this, e);
    }

    public abstract string Text { get; set; }
}

لاحظ أنه حتى الآن كل شيء التكنولوجيا الملحد. الآن ها هي تنفيذ لأشكال مربع نص الفوز:

public class TextBoxWidget : TextWidget<TextBox>
{

    public TextBoxWidget(TextBox textBox)
    {
        textBox.TextChanged += InvokeTextChanged;
        _wrappedWidget = textBox;
    }

    public override string Text
    {
        get { return _wrappedWidget.Text; }
        set { _wrappedWidget.Text = value; }
    }
}

وهذا يحصل مثيل في النموذج نفسه، والذي يعود إلى MVP هو أيضا IViewWhatever:

public partial class ProjectPickerForm : Form, IProjectPickerView
{

    private IProjectPickerPresenter _presenter;
    public void InitializePresenter(IProjectPickerPresenter presenter) {
        _presenter = presenter;
        _presenter.InitializeWidgets(
            ...
            new TextBoxWidget(txtDescription));
    }
            ...
}

وفي مقدم:

public class ProjectPickerPresenter : IProjectPickerPresenter
{
    ...
    public void InitializeWidgets(ITextWidget descriptionFilter) {

        Check.RequireNotNull<ITextWidget>(descriptionFilter, "descriptionFilter");
        DescriptionFilter = descriptionFilter;
        DescriptionFilter.Text = string.Empty;
        DescriptionFilter.TextChanged += OnDescriptionTextChanged;

    }
    ...

    public void OnDescriptionTextChanged(object sender, EventArgs e) {
        FilterService.DescriptionFilterValue = DescriptionFilter.Text;
    }

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

لإسقاط الخاص إلى أسفل، القوة الخاصة بك فقط في حاجة إلى نوع الحدث SelectedIndexChanged الذي كنت بديلا لهذه الأمثلة TextChanged الحدث.

نصائح أخرى

عند تحكم الرؤية interation الحصول على معقدة للغاية وعادة ما تقسيمها إلى subcontrollers وsubviews.

ويمكن أن يكون لديك عناصر في مكرر يمكن للمستخدم التحكم التي لديها وجهات نظرهم الخاصة وأجهزة التحكم. يمكن أن العرض الرئيسي الخاص بك، ثم لديها قائمة من subviews (usercontrols) التي لديها وحدات التحكم الخاصة بها التي يتم الاحتفاظ بها من قبل وحدة تحكم رئيسية.

وعندما ينقر المستخدم التحكم الرئيسي الخاص بك المقبل يمكن الإشارة جميع subcontrollers لتحديث البنود الخاصة بهم من وجهات نظرهم.

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