none
WPF exécuter une méthode de l'objet utilisé pour le binding RRS feed

  • Question

  • Bonjour,

    je me suis lancé dans le WPF depuis quelques semaines, et jusqu'à lors j'ai trouvé toutes les réponses à mes questions sur divers forums, sauf celle-ci.

    Je dispose d'un objet, dont une méthode string est bindée sur Text d'un textBlock lui même dans un Button.

    Au click du bouton, via le code behind, le texte de mon objet change et par la même occasion celui du textBlock.

    Voilà le code de l'objet:

    using System.ComponentModel;
    
    namespace Test_WPF
    {
        public class MyClass:INotifyPropertyChanged
        {
            private string textButton = "First text";
    
            public string TextButton
            {
                get { return textButton; }
                set 
                {
                    if (textButton != value)
                    {
                        textButton = value;
                        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("TextButton"));
                    }
                }
            }
    
            public void ChangeText()
            {
                TextButton = "New text";
            }
            
    
            public event PropertyChangedEventHandler PropertyChanged;
        }
    }
    

    le xaml:

    <Window x:Class="Test_WPF.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
    
        <Grid>
            <Button x:Name="MyButton" HorizontalAlignment="Left" Margin="308,120,0,0" VerticalAlignment="Top" Width="75" Click="MyButton_Click">
                <TextBlock Text="{Binding TextButton}"/>
            </Button>
    
        </Grid>
    </Window>
    

    et le code behind:

    using System.Windows;
    
    namespace Test_WPF
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
    
            private MyClass myClass;
    
    
            public MainWindow()
            {
                InitializeComponent();
                myClass = new MyClass();
                MyButton.DataContext = myClass;
            }
    
            private void MyButton_Click(object sender, RoutedEventArgs e)
            {
                myClass.ChangeText();
            }
        }
    }
    

    Je voudrais savoir s'il est possible d'exécuter 

    myClass.ChangeText();

    directement dans le xaml?

    quelque chose comme ça:

     <Button x:Name="MyButton" HorizontalAlignment="Left" Margin="308,120,0,0" VerticalAlignment="Top" Width="75" Click=myObject.ChangeText>

    Merci d'avance

    vendredi 13 février 2015 20:48

Réponses

  • Bonjour,

    C'est tout à fait possible avec la propriété Command d'un Button que vous pouvez "binder" avec une ICommand.

    Le plus simple est :

    1/ récupérer le code d'une classe RelayCommand (il en existe plein sur le web, exemple ici)

    2/ Ajouter une propriéité de type ICommand (votre RelayCommand) dans votre ViewModel

    Cette dernière attend deux arguments : La méthode ExecuteCommand et canExecuteCommand

    public RelayCommand MaCommandCommand
    {
        get
        {
            return _maCommand ?? _maCommand = new RelayCommand(ExecuteMaCommand, null);
        }
    }
    
    private void ExecuteMaCommand()
    {
      //....
    }


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Marqué comme réponse Whismeril dimanche 15 février 2015 16:53
    samedi 14 février 2015 11:50

Toutes les réponses

  • Bonjour,

    C'est tout à fait possible avec la propriété Command d'un Button que vous pouvez "binder" avec une ICommand.

    Le plus simple est :

    1/ récupérer le code d'une classe RelayCommand (il en existe plein sur le web, exemple ici)

    2/ Ajouter une propriéité de type ICommand (votre RelayCommand) dans votre ViewModel

    Cette dernière attend deux arguments : La méthode ExecuteCommand et canExecuteCommand

    public RelayCommand MaCommandCommand
    {
        get
        {
            return _maCommand ?? _maCommand = new RelayCommand(ExecuteMaCommand, null);
        }
    }
    
    private void ExecuteMaCommand()
    {
      //....
    }


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Marqué comme réponse Whismeril dimanche 15 février 2015 16:53
    samedi 14 février 2015 11:50
  • Bonjour et merci je vais regarder ça.

    Sur un autre forum, on m'a proposé ceci qui fonctionne:

    <Window x:Class="Test_WPF.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:def="Definition"
            Title="MainWindow" Height="350" Width="525">
    
        <Grid>
            <Button x:Name="MyButton" HorizontalAlignment="Left" Margin="308,120,0,0" VerticalAlignment="Top" Width="75" Click="ButtonOnClick">
                <TextBlock Text="{Binding TextButton}"/>
            </Button>
            <x:Code>
                <![CDATA[
                void ButtonOnClick(object sender, RoutedEventArgs args)
                {
                    Button btn = sender as Button;
                    ((MyClass)btn.DataContext).ChangeText();
                }
                ]]>
    
            </x:Code>
        </Grid>
    </Window>

    dimanche 15 février 2015 10:44
  • BOF ;-)

    Si vous voulez vraiment une approche MVVM, utilisez les ICommand


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    dimanche 15 février 2015 15:50
  • Oui je vais y regarder.

    Cependant, pour l'instant, je n'ai utilisé de viewModel, donc il faut que je revois mon application pour essayer.

    dimanche 15 février 2015 16:53