WPF MVVM ICommnad مع ListView


مرحبًا،

لدي سؤال حول ICommand وMVVM في WPF.

لقد رأيت أن الطريقة الأكثر شيوعًا للتعامل مع الأحداث هي استخدام واجهة ICommand.

أدرك أنني إذا أردت إضافة أمر إلى زر، فإنني أفعل شيئًا مثل هذا:
<Button Command="{MyCommand}" />

لكنني لا أفهم كيفية إنشاء أمر للاختيار أو شيء من هذا القبيل لـ ListView؟

هل يعرف أحد أي أمثلة جيدة هناك، أو يمكن أن يساعدني مع بعض التعليمات البرمجية البسيطة؟

————————————————– ————————————————-

أهلا مرة أخرى،
لا تزال لدي مشكلات في تنفيذ Icommand لـ SelectionChanged في listView.
لقد وجدت هذا المنصب: http://blog.fossmo.net/post/How-to-create-an-attached-property-in-WPF-using-a-ComboBox.aspx[^] لكنني لست متأكدًا مما يعنيه بقوله: “يمكن أن يكون MyCommand بمثابة DelegateCommand من CAG.” كيف يمكن أن تبدو فئة CAG؟

الحل 2

بادئ ذي بدء، ICommand ليس آلية لدعم الأحداث. إنها الآلية التي يجب من خلالها أداء الوظائف القائمة على الأوامر في WPF أو Silverlight. السبب وراء قولي هذا هو أنه يتجاوز ما يجب أن يفعله الحدث – باستخدام البنية الأساسية للتحكم، يمكنك أيضًا التأثير على واجهة المستخدم من خلال تحديد ما إذا كان يمكن أن يحدث شيء ما أم لا لأن واجهة ICommand تدعم أيضًا طريقة CanExecute. عندما يدعم شيء ما ICommand، ستأخذ واجهة المستخدم هذه الطريقة في الاعتبار، بحيث لا يمكنك الضغط على زر عندما يُرجع CanExecute خطأ.

كما تعلم الآن، لا يمكنك ربط ICommand بتحديد تم تغييره لأنه لا يدعم ربط الأوامر. في البداية، قد يبدو هذا مشكلة حقيقية، ولكن هناك عدد من الحلول التي تدعم ذلك. ربما يكون أفضل تطبيق هو دعم EventToCommand في MVVM Light والذي يمكنك العثور عليه هنا[^].

يوضح لوران استخدام هذا السلوك هنا[^].

الحل 1

أفضل الأمثلة التي صادفتها هي استخدام الخصائص المرفقة. يمكن العثور على مثال جيد على ذلك في مدونة كلاوس كونراد WPF ListView MVVM وICommand مفقود[^]. يمكن استخدام الخصائص المرفقة لجميع أنواع الأشياء وهي بالتأكيد تستحق الراحة معها.

أتمنى أن يساعدك هذا

الحل 4

For handling the SelectionChanged event in a ListView, there are two possible approaches: either by attaching a behavior or by using the Interaction framework.

For complete solution,I have created an example for it. follow the following steps:

==> Install Nuget package of "Microsoft.Xaml.Behaviors"

==>MainWindow.Xaml will be like below

<Window x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp3"
         xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ListView ItemsSource="{Binding Items}" 
          SelectedItem="{Binding SelectedItem}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <!-- ListView content here -->
        </ListView>

    </Grid>
</Window>

==>MainWindow.Xaml.cs

using System.Windows;

namespace WpfApp3
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainViewModel();
        }
    }
}

==>I've developed a ViewModel tailored for the provided XAML, facilitating the binding of commands with the view.

using System;
using System.Collections.Generic;
using System;
using System.Collections.ObjectModel;
using System.Windows.Input;

namespace WpfApp3
{
    public class MainViewModel
    {
        public ObservableCollection<string> Items { get; set; }

        public ICommand SelectionChangedCommand { get; set; }

        public MainViewModel()
        {
            Items = new ObservableCollection<string>
            {
                "Item 1",
                "Item 2",
                "Item 3"
            };

            SelectionChangedCommand = new RelayCommand(OnSelectionChanged);
        }

        private void OnSelectionChanged(object selectedItem)
        {
            // Handle selection changed logic here
            Console.WriteLine("Selected item: " + selectedItem);
        }
    }
}

==>RelayCommand.cs class 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace WpfApp3
{
    public class RelayCommand : ICommand
    {
        private readonly Action<object> _execute;
        private readonly Func<object, bool> _canExecute;

        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            _execute = execute ?? throw new ArgumentNullException(nameof(execute));
            _canExecute = canExecute;
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute == null || _canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            _execute(parameter);
        }
    }
}

コメント

タイトルとURLをコピーしました