web-dev-qa-db-fra.com

Comment peut-on "désactiver" un bouton dans WPF en utilisant le modèle MVVM?

J'essaie de comprendre WPF et MVVM et je progresse bien. Les aspects WPF et MVVM se passent bien.

Cependant, le côté XAML et la liaison de données est une toute autre histoire :)

Comment pourrais-je "désactiver" un bouton?

Par exemple, j'ai une propriété CanClose dans mon modèle de vue qui détermine si l'application peut ou non être actuellement fermée. Si un thread de travail est en train de faire quelque chose, alors cette propriété est définie sur false et je souhaite soit griser le bouton, soit désactiver de manière visuelle le bouton Fermer via une sorte de liaison.

Comment dois-je prendre?

Merci!

Edition -

Dommage que je ne peux accepter une réponse.

Ces deux réponses m'a énormément aidé. Dans le message de Kent, il est allé plus loin en expliquant pourquoi vous devriez implémenter une infrastructure de commande dans votre application plutôt que de désactiver un bouton de la manière que j'avais posée:

Comment peut-on "désactiver" un bouton dans WPF en utilisant le modèle MVVM?

Et la réponse à ma question initiale:

Comment peut-on "désactiver" un bouton dans WPF en utilisant le modèle MVVM?

20
Ian P

En utilisant le modèle de commande. Dans votre modèle de vue:

public class MyViewModel : ViewModel
{
    private readonly ICommand someCommand;

    public MyViewModel()
    {
        this.someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething);
    }

    public ICommand SomeCommand
    {
        get { return this.someCommand; }
    }

    private void DoSomething(object state)
    {
        // do something here
    }

    private bool CanDoSomething(object state)
    {
        // return true/false here is enabled/disable button
    }
}

Dans votre XAML:

<Button Command="{Binding SomeCommand}">Do Something</Button>

Lisez cet article pour en savoir plus sur la DelegateCommand.

31
Kent Boogaart

Liez simplement la propriété IsEnabled du bouton à CanClose: 

<Button IsEnabled="{Binding CanClose}"/>
35
Quartermeister

Si vous retournez la valeur false à CanExecute of ICommand, Button sera désactivé. Ainsi, quelle que soit la commande à laquelle votre bouton est lié, voyez si vous pouvez renvoyer CanExecute avec la valeur false lorsque vous souhaitez le désactiver.

10
Akash Kava

Cela fonctionne aussi:

Vue :

        <Button>
            <Button.Style>
                <Style>
                    <Setter Property="Content" Value="Scream" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding btnEnabled}" Value="True">
                            <Setter Property="IsEnabled" Value="True" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>

ViewModel :

    private bool _btnEnabled;
    public bool btnEnabled
    {
        get { return _btnEnabled; }
        set
        {
            if (_btnEnabled != value)
            {
                _btnEnabled = value;
                OnPropertyChanged();
            }
        }
    }
1
usefulBee