web-dev-qa-db-ja.com

MVVMパターンを使用してWPFのボタンを「無効化」するにはどうすればよいですか?

私はWPFとMVVMを理解しようとしていますが、順調に進んでいます。 WPFとMVVMの側面は順調に進んでいます。

ただし、XAMLとデータバインディングの側面はまったく別の話です。

ボタンを「無効化」するにはどうすればよいですか?

たとえば、アプリケーションを現在閉じることができるかどうかを決定するCanCloseプロパティがビューモデルにあります。ワーカースレッドがオフになっている場合、このプロパティはfalseに設定されており、ボタンをグレー表示するか、なんらかのバインディングによって[閉じる]ボタンを何らかの方法で視覚的に無効にしたいと思います。

これを行うにはどうすればよいですか?

ありがとう!

編集-

残念ながら、私は1つの回答しか受け入れることができません。

これら2つの答えは、私を大きく助けてくれました。ケントの投稿では、私が尋ねた方法でボタンを無効にするのではなく、アプリケーションにコマンドインフラストラクチャを実装する必要がある理由を説明することで、彼はさらに一歩進んだ。

MVVMパターンを使用してWPFのボタンを「無効にする」方法

そして私の元の質問への答え:

MVVMパターンを使用してWPFのボタンを「無効にする」方法

21
Ian P

コマンドパターンを使用する方法。ビューモデルで:

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
    }
}

XAMLで:

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

この投稿 を読んで、DelegateCommandの詳細を確認してください。

34
Kent Boogaart

ボタンの IsEnabled プロパティをCanCloseにバインドするだけです。

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

ICommandのCanExecuteに値falseを返すと、ボタンは無効になります。ボタンがバインドされているすべてのコマンドについて、無効にしたいときにCanExecuteにfalseの値を返すことができるかどうかを確認してください。

10
Akash Kava

これも機能します:

ビュー

        <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();
            }
        }
    }
2
usefulBee