البرمجة

تفعيل زر إزالة العنصر الأخير في ListBox باستخدام XAML وCode-Behind

في سياق تطوير تطبيقات واجهة المستخدم باستخدام لغة برمجة XAML وتقنيات تطوير تطبيقات ويندوز، يعد تفعيل زر إزالة العنصر الأخير في قائمة ListBox تحدًا هامًا. يمكن تحقيق هذا الهدف من خلال استخدام مزيج من التفاعل مع العناصر في ListBox واستخدام الرموز البرمجية في رمجة الـ Code-Behind لتحديد ما إذا كان يجب تمكين أزرار الإزالة أم لا.

في البداية، يجب أن تكون قالب العنصر (ItemTemplate) في ListBox يحتوي على عنصرين رئيسيين: TextBlock لعرض النص وزر (Button) للقيام بعملية الإزالة. يتعين تعريف الـ DataTemplate بهذه الطريقة:

xaml

حيث يُفترض أن يكون لديك نموذج بيانات (ViewModel) يحتوي على خاصية “ItemText” لتمثيل نص العنصر.

الخطوة التالية هي التفاعل مع الرموز البرمجية في Code-Behind. يمكن استخدام حدث “Loaded” للعنصر الأم لـ ListBox لتنفيذ التحقق من موقع العنصر ضمن القائمة. يمكن تنفيذها بالشكل التالي:

csharp
private void RemoveButton_Click(object sender, RoutedEventArgs e) { // استرجاع الزر الذي تم النقر عليه Button clickedButton = (Button)sender; // استرجاع البيانات المرتبطة بالزر YourDataModel dataItem = (YourDataModel)clickedButton.DataContext; // التحقق مما إذا كان العنصر هو العنصر الأخير في القائمة int indexOfItem = myListBox.Items.IndexOf(dataItem); if (indexOfItem == myListBox.Items.Count - 1) { // قم بتنفيذ العمليات الخاصة بإزالة العنصر // ... // تحديث حالة الأزرار بناءً على الموقف الجديد UpdateRemoveButtonsState(); } } private void UpdateRemoveButtonsState() { foreach (var item in myListBox.Items) { // استرجاع الزر داخل كل عنصر Button removeButton = FindVisualChild

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

المزيد من المعلومات

بالتأكيد، سنقوم بتوسيع المعلومات حول كيفية تنفيذ هذا السيناريو بشكل أكثر تفصيلاً.

أولاً وقبل كل شيء، يتطلب تحقيق هذا الهدف استخدام تقنيات ربط البيانات (Data Binding) وتعريف القوالب (Templates) في لغة XAML لإنشاء واجهة مستخدم فعالة وسهلة الصيانة.

في مثال الشيفرة السابق، قمنا بتحديد نموذج بيانات بسيط (YourDataModel) لتمثيل بيانات كل عنصر في ListBox. يمكن تحسين هذا النموذج بمزيد من التفاصيل والخصائص التي تحمل البيانات الخاصة بكل عنصر، وعلى سبيل المثال:

csharp
public class ListItemModel : INotifyPropertyChanged { private string _itemText; public string ItemText { get { return _itemText; } set { if (_itemText != value) { _itemText = value; OnPropertyChanged(nameof(ItemText)); } } } // يمكنك إضافة المزيد من الخصائص حسب احتياجات التطبيق // ... public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }

في هذا المثال، قمنا بتحسين النموذج ليحتوي على خاصية ItemText ويُعلن عن تغييراتها باستخدام واجهة INotifyPropertyChanged. يمكنك إضافة مزيد من الخصائص والتكيف وفقًا لمتطلبات تطبيقك.

ثانيًا، يمكن أيضًا تحسين الكود ليدعم أفضل مبدأ البرمجة الكائنية (Object-Oriented Programming) وفصل المسؤوليات. على سبيل المثال، يمكن إنشاء فئة تدير عمليات التحكم في الـ ListBox والتفاعل معها، وهي فئة تسمى ListBoxManager:

csharp
public class ListBoxManager { private ListBox _listBox; public ListBoxManager(ListBox listBox) { _listBox = listBox; HookUpEvents(); } private void HookUpEvents() { _listBox.Loaded += ListBox_Loaded; } private void ListBox_Loaded(object sender, RoutedEventArgs e) { UpdateRemoveButtonsState(); } private void RemoveButton_Click(object sender, RoutedEventArgs e) { Button clickedButton = (Button)sender; ListItemModel dataItem = (ListItemModel)clickedButton.DataContext; int indexOfItem = _listBox.Items.IndexOf(dataItem); if (indexOfItem == _listBox.Items.Count - 1) { // Perform removal operations... // ... UpdateRemoveButtonsState(); } } private void UpdateRemoveButtonsState() { foreach (var item in _listBox.Items) { Button removeButton = FindVisualChild

ثم يمكن استخدام ListBoxManager في Code-Behind الخاص بصفحة الـ XAML لتفويج إعداد الـ ListBox:

csharp
public partial class MainPage : Page { private ListBoxManager _listBoxManager; public MainPage() { InitializeComponent(); _listBoxManager = new ListBoxManager(myListBox); } }

تمثل هذه الهيكلة تحسينًا للتنظيم وإدارة الكود، حيث يتم تقديم طبقة إضافية للتفاعل مع العناصر وإدارة الحدث. يمكنك توسيع هذا النهج لتنفيذ مزيد من الميزات وتحسين تجربة المستخدم وكفاءة البرمجة.

زر الذهاب إلى الأعلى