خصائص التبعية المخصصة وربط Twoway في WPF
-
03-07-2019 - |
سؤال
لدينا كائن مستمد من DependencyObject ، وينفذ بعض التبعية.
في الأساس شيء مثل هذا:
class Context : DependencyObject {
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata (""));
public string Name {
get {
return (string)this.GetValue (NameProperty);
}
set {
this.SetValue (NameProperty, value);
}
}
}
هذا يعمل ، يتم إعداد الخاصية ، يمكن أن يكون ملزماً ، وما إلى ذلك. تأتي المشكلة عندما أقوم بربط propery من WPF ، باستخدام ربط Twoway. جزء Twoway لا يحدث فعليًا ، لا يطلق WPF أبدًا مجموعة هذه الخاصية. لقد قمت بتعيين الربط مثل هذا:
<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
في هذه الحالة ، يجب على الكتابة في مربع النص تحديث خاصية الاسم على الفور ، لكنها لا تفعل ذلك. إذا قمت بتغيير خاصية الاسم لتكون خاصية POCO منتظمة ، فهي تعمل (على الرغم من أن الجانب الآخر من twoway لا إلا إذا قمت بتطبيق inotifyPropertyChanged).
ماذا أفعل خطأ هنا؟ يجب أن يكون هذا أمرًا بسيطًا حقًا ، لكنه لا يسبب لي نهاية الصداع.
المحلول
هذا هو السلوك المتوقع. خاصية CLR هي مجرد غلاف حول الكامنة DependencyProperty
. غالبًا ما يتحسن WPF عن طريق الاتصال GetValue
و SetValue
مباشرة. إذا كنت بحاجة إلى منطق مخصص للتنفيذ ، فاستخدم بيانات تعريف DependencyProperty
.
نصائح أخرى
بعد هذه القضية كلفني بعض الوقت:
لأولئك منكم الذين لديهم نفس المشكلة ، ولكن - مثلي - لا ترى الحل في الإجابة أعلاه:
لدعم ميراث datacontext ، يجب اشتقاق الفئة المخصصة (السياق في هذه الحالة) الإطار عوضا عن الاعتماد. هذا كل شئ.
مارك