Comment désactiver un bouton dans WPF en utilisant le modèle MVVM?

j'essaie de saisir la WPF et la MVVM et j'ai fait de bons progrès. Le FPF et le MVVM vont bien.

Toutefois, le code XAML et la liaison de données secondaires est une toute autre histoire :)

Comment puis-je désactiver un bouton?

par exemple, j'ai une propriété CanClose dans mon Model view qui détermine si oui ou non l'application peut être actuellement fermée. Si un thread worker fait quelque chose, alors cette propriété est définie à false et j'aimerais soit griser le bouton ou désactiver visuellement le bouton Fermer via une sorte de reliure.

comment je ferais ça?

Merci!

Edit -

dommage que je ne puisse accepter qu'une seule réponse.

Ces deux réponses m'a énormément aidé. Dans le post de Kent, il est allé un peu plus loin en expliquant pourquoi vous devriez implémenter une infrastructure de commande dans votre application au lieu de désactiver une bouton de la façon que j'avais demandé:

comment désactiver un bouton dans WPF en utilisant le modèle MVVM?

Et la réponse à ma question initiale:

comment désactiver un bouton dans WPF en utilisant le modèle MVVM?

18
demandé sur Community 2010-08-13 16:18:55

4 réponses

en utilisant la commande pattern. 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 code XAML:

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

Lire ce post pour en savoir plus sur le DelegateCommand.

30
répondu Kent Boogaart 2011-09-27 15:15:28

liez juste le IsEnabled propriété du bouton CanClose:

<Button IsEnabled="{Binding CanClose}"/>
33
répondu Quartermeister 2010-08-13 12:20:50

si vous retournez CanExecute d'ICommand une valeur de false, alors le bouton sera désactivé. Donc quelle que soit la commande à laquelle votre bouton est lié, voyez si vous pouvez retourner Canexécute une valeur de false quand vous voulez la désactiver.

9
répondu Akash Kava 2010-08-13 12:21:04

Ceci fonctionne:

View:

        <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
répondu usefulBee 2016-05-06 20:07:20