簡體   English   中英

如何使用 MVVM 模式“禁用”WPF 中的按鈕?

[英]How does one "disable" a button in WPF using the MVVM pattern?

我正在嘗試掌握 WPF 和 MVVM,並且取得了良好的進展。 WPF 和 MVVM 方面進展順利。

但是,XAML 和數據綁定方面是另一回事:)

我將如何“禁用”按鈕?

例如,我的視圖模型中有一個 CanClose 屬性,用於確定當前是否可以關閉應用程序。 如果工作線程停止執行某事,則此屬性設置為 false,我想將按鈕灰顯或以某種方式通過某種綁定在視覺上禁用“關閉”按鈕。

我該怎么做呢?

謝謝!

編輯 -

可惜我只能接受一個答案。

這兩個答案對我幫助很大。 在 Kent 的帖子中,他更進一步解釋了為什么應該在應用程序中實現命令基礎結構,而不是像我問的那樣禁用按鈕:

如何使用 MVVM 模式“禁用”WPF 中的按鈕?

以及我原來問題的答案:

如何使用 MVVM 模式“禁用”WPF 中的按鈕?

只需將 Button 的IsEnabled屬性綁定到 CanClose:

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

通過使用命令模式。 在您的視圖模型中:

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更多信息。

如果您返回 ICommand 的 CanExecute 值為 false,則 Button 將被禁用。 因此,無論您的按鈕綁定到什么命令,當您想禁用它時,看看您是否可以返回一個值為 false 的 CanExecute。

這也有效:

查看

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

視圖模型

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

ViewModel 文件中的更改:

public bool IsButtonEnabled { get { return _isButtonEnabled; }

set
{
    if (_isButtonEnabled == value)
    {
        return;
    }

    _isButtonEnabled = value;
    OnPropertyChanged("IsButtonEnabled");
}
}

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

Button 的 XAML 文件中的更改:IsEnabled="{Binding IsButtonEnabled}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM