اسف يبدو انني لم اضف السورس للـ Datatrigger المطور ، تم ارافقه في الرد
الطريقة هي باستخدام الوراثة من الـ Microsoft.Expression.Interactivity.Core.DataTrigger
ثم عمل Override الى دالة
OnPropertyChanged وهي دالة تنطلق عند اي تغيير يحصل في احد خصائص الـ object في البليند
FrameworkElement.OnPropertyChanged Method - MSDN
فيوجد داخل هذي الدالة كودين اساسيين لجعل هذا الترييغر فعال في الـ DesignTime :
1.
PHP كود :
this.Actions.ToList().ForEach(a => a.Attach(TargetObject));
وظيفته الدوران حول الاكشن المرتبطين بالـ Trigger وعمل Attach لهم للـ TargetObject وهو الـ Control الهدف (مثلا Progressbar)
لأن الـ Attach بطبيعة الحال يتم عند تشغيل البرنامج(runtime) وباتالي يتم ربط الاكشن بالكونترول عند التشغيل
ولكن ماقبل التشغيل في (Design time) لا يتم الربط بعد وبالتالي احتجنا هذا الكود ووضعناه في OnPropertyChanged خصيصا لانها تنطلق في الـDesign Time كذلك
2.
PHP كود :
this.InvokeActions(null);
نعرف ان الـTigger وظيفته اطلاق الاكشن ، فهذا الكود ايضا وضغناه اسفل كود Attach ليطلق الاكشن بشكل Force ، اي
استدعاء اجباري ، فنعرف ان الـTrigger يقوم باطلاق الاكشن اوتماتيكيا عند تحقق شرط معين ولكن هذا يحصل فقط في الـ Runtime ، اما في الـDesing Time لابد من العنف واجبار الـTrigger على اطلاق الاكشن رغما عنه عند تحقق الشروط ، لذلك ترى الكود كاملا بهذا الاسلوب
:
PHP كود :
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (TargetObject != null)
{
this.Actions.ToList().ForEach(a => a.Attach(TargetObject));
if (Comparison == ComparisonConditionType.Equal)
{
if (Binding.ToString() == Value.ToString())
this.InvokeActions(null);
}
else if (Comparison == ComparisonConditionType.GreaterThan)
{
if (int.Parse(Binding.ToString()) > int.Parse(Value.ToString()))
this.InvokeActions(null);
}
else if (Comparison == ComparisonConditionType.GreaterThanOrEqual)
{
if (int.Parse(Binding.ToString()) >= int.Parse(Value.ToString()))
this.InvokeActions(null);
}
else if (Comparison == ComparisonConditionType.LessThan)
{
if (int.Parse(Binding.ToString()) < int.Parse(Value.ToString()))
this.InvokeActions(null);
}
else if (Comparison == ComparisonConditionType.LessThanOrEqual)
{
if (int.Parse(Binding.ToString()) <= int.Parse(Value.ToString()))
this.InvokeActions(null);
}
else if (Comparison == ComparisonConditionType.NotEqual)
{
if (Binding.ToString() != Value.ToString())
this.InvokeActions(null);
}
}
}
وهذه الطريقة يمكنك استعمالها مع بقية الـTrigger وتطويرها بنفس الاسلوب لتدعم الـDesign Time
بشرط ان لاتقوم باضافة ConditionList ـ لان الـ Condition يحتاج تطوير ايضا ليدعم الـ DesignTime وتطويره معقد نوعا ما وعند تطويره اساسا ستكون مجبرا على كتابة الـ ConditionList يدويا بـ Xaml ، فلا يمكنك استعمال المربع
: