سؤال

أنا أتابع إم-ف-فم نمط لواجهة مستخدم WPF الخاصة بي.أرغب في ربط أمر بالحدث TextChanged الخاص بـ TextBox بأمر موجود في فئة ViewModel الخاصة بي.الطريقة الوحيدة التي يمكنني تصورها لإكمال هذه المهمة هي الوراثة من عنصر التحكم TextBox، وتنفيذ ICommandSource.يمكنني بعد ذلك توجيه الأمر ليتم إطلاقه من حدث TextChanged.يبدو أن هذا يتطلب الكثير من العمل بالنسبة لشيء يبدو بسيطًا جدًا.

هل هناك طريقة أسهل (من التصنيف الفرعي لـ TextBox وتنفيذ ICommandSource) لربط حدث TextChanged بفصل ViewModel الخاص بي؟

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

المحلول

أولاً، من المؤكد أنك فكرت في ربط البيانات في اتجاهين بنموذج العرض الخاص بك، باستخدام UpdateSourceTrigger الخاص بـ PropertyChanged؟بهذه الطريقة سيتم استدعاء أداة ضبط الخاصية التي ترتبط بها في كل مرة يتم فيها تغيير النص؟

إذا لم يكن هذا كافيًا، فسأعالج هذه المشكلة باستخدام السلوكيات المرفقة.ستجد في مدونة جوليان دومينغيز شرط حول كيفية القيام بشيء مشابه جدًا في Silverlight، والذي يجب أن يكون قابلاً للتكيف بسهولة مع WPF.

بشكل أساسي، في فئة ثابتة (تسمى، على سبيل المثال، TextBoxBehaviours) يمكنك تحديد خاصية مرفقة تسمى (ربما) TextChangedCommand من النوع ICommand.قم بتوصيل معالج OnPropertyChanged لتلك الخاصية، وداخل المعالج، تأكد من تعيين الخاصية على TextBox؛إذا كان الأمر كذلك، قم بإضافة معالج إلى الحدث TextChanged في مربع النص الذي سيقوم باستدعاء الأمر المحدد في الخاصية.

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

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />

نصائح أخرى

قد لا يكون استخدام طريقة ربط الحدث والأوامر هو الشيء الصحيح الذي يجب استخدامه.ماذا سيفعل هذا الأمر بالضبط؟

قد ترغب في التفكير في استخدام Databinding لحقل سلسلة في جهاز VM الخاص بك.بهذه الطريقة يمكنك إجراء اتصال بأمر أو وظيفة من هناك بدلاً من الاهتمام بواجهة المستخدم على الإطلاق.

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}

ألا يمكنك فقط التعامل مع حدث TextChanged وتنفيذ الأمر من هناك؟

private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

البديل، كما تقول، هو إنشاء TextBox يعمل كمصدر للأوامر، لكن هذا يبدو مبالغًا فيه ما لم يكن شيئًا تخطط لمشاركته والاستفادة منه في العديد من الأماكن.

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