WPF MVVM ICommmnad con ListView

programación


Hola,

Tengo una pregunta sobre ICommand y MVVM en WPF.

He visto que la forma más común de manejar eventos es mediante la interfaz ICommand.

Entiendo que si quiero agregar un comando a un botón, hago algo como esto:
<Button Command="{MyCommand}" />

¿Pero no entiendo cómo crear un comando para cambiar la selección o algo así para un ListView?

¿Alguien conoce algún buen ejemplo o podría ayudarme con algún código simple?

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

Hola de nuevo,
Todavía tengo problemas con la implementación de Icommand de SelectionChanged en listView.
Encontré esta publicación: http://blog.fossmo.net/post/How-to-create-an-attached-property-in-WPF-using-a-ComboBox.aspx[^] pero no estoy seguro de lo que quiere decir con: “MyCommand puede ser un DelegateCommand de CAG”. ¿Cómo podría ser una clase CAG?

Solución 2

En primer lugar, ICommand no es el mecanismo para respaldar eventos. Es el mecanismo mediante el cual debe realizar la funcionalidad basada en comandos en WPF o Silverlight. La razón por la que digo esto es porque va más allá de lo que debería hacer un evento: con la infraestructura de comando, también puede afectar la interfaz de usuario al determinar si algo puede suceder o no porque la interfaz ICommand también admite un método CanExecute. Cuando algo admite ICommand, la interfaz de usuario realmente tendrá en cuenta este método, de modo que no pueda presionar un botón cuando CanExecute devuelva falso.

Como ya sabe, no puede vincular un ICommand a una selección modificada porque no admite la vinculación de comandos. Al principio, esto parecería un problema real, pero existen varias soluciones que lo respaldan. Probablemente la mejor implementación es la compatibilidad con EventToCommand en MVVM Light, que puede encontrar aquí[^].

Laurent demuestra cómo utilizar este comportamiento. aquí[^].

Solución 1

Los mejores ejemplos que he encontrado utilizan propiedades adjuntas. Un buen ejemplo de esto lo podemos encontrar en el Blog de Claus Conrads. WPF ListView MVVM y falta ICommand[^]. Las propiedades adjuntas se pueden utilizar para todo tipo de cosas y definitivamente vale la pena sentirse cómodo con ellas.

Espero que esto ayude

Solución 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をコピーしました