Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

10 mars 2014 1 10 /03 /mars /2014 12:58

RelayCommand

public class RelayCommand : ICommand
    {
        readonly Action<object> _execute;
        readonly Predicate<object> _canExecute;
 
        public RelayCommand(Action<object> execute): this(execute, null){ }
        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            if (execute == null) throw new ArgumentNullException("execute");
            _execute = execute;
            _canExecute = canExecute;
        }
 
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }
        public event EventHandler CanExecuteChanged
        {
            add {CommandManager.RequerySuggested += value;}
            remove {CommandManager.RequerySuggested -= value;}
        }
        public void Execute(object parameter)
        {
            _execute(parameter);
        }
    }

 

Le bouton :
<Button Content="Supprimer" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveImageCommand}" CommandParameter="{Binding .}" />

 

  • Il faut spécifier la source de données car sinon cela va chercher la commande … dans l’observableCollection .Exemple si je mettais simplement  Command="{Binding RemoveImageCommand}"  cela irait chercher la commande à exécuter dans la collection de photos et non le ViewModel
  • CommandParameter : c’est l’objet à passer, ici j’envoie la photo courante ( {Binding .} et {Binding} c'est la même chose)

La listBox d’un userControl le bouton et l’ItemTemplate(simplifié pour la clarté de l'exemple) 

 

<ListBox  ItemsSource="{Binding Article.Photos}" >
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <WrapPanel>
                                            <Image Source="{Binding Picture}" />
                                            <Button Content="Supprimer" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveImageCommand}" CommandParameter="{Binding .}" />
                                        </WrapPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>

 

Dans le ViewModel (ArticleViewModel dans mon exemple)

 

        public RelayCommand RemoveImageCommand { get; private set; }
 
        protected override void InitializeCommands()
        {
            RemoveImageCommand = new RelayCommand(RemoveImage);           
        }
 
        public void RemoveImage(object image)
        {
            if (Article != null && image !=null)
            {
                if (dialogService.Confirm("Suppression d'image", "Voulez-vous supprimer l'image ? "))
                {
                    Article.Photos.Remove((PhotoModel)image); 
                }
            }
        }
 

 

Partager cet article

Repost 0
Published by Romagny13 - dans MVVM
commenter cet article

commentaires