繁体   English   中英

RelayCommand WPF上的“启用”按钮

[英]Enable Button on RelayCommand WPF

按钮未在命令启用的doEnable方法上启用。 单击方法禁用按钮。 按钮IsEnabled与ViewModel公共属性IsEnable绑定,该属性在doEnable上设置为true。 请告知以下代码有什么问题

XAML:

<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" Click="ButtonBase_OnClick" IsEnabled="{Binding IsEnable}" ></Button>

Window2.cs:

public partial class Window2 : Window
{
    public Window2()
    {
        InitializeComponent();
        DataContext = new ButtonEnableViewModel();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    {
        if(sender is Button btn)
            btn.IsEnabled = false;
    }
}

ButtonEnableViewModel.cs

class ButtonEnableViewModel : INotifyPropertyChanged 
{
    public ButtonEnableViewModel() 
    {
        IsEnable = true;
        DataText = "Click Here";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChange(string name) 
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    private RelayCommand _enableCmd;
    public RelayCommand Enable => _enableCmd ?? (_enableCmd = new RelayCommand(doEnable));

    public bool IsEnable { get; set; }
    public string DataText { get; set; }

    protected void doEnable(object obj) 
    {
        IsEnable = true;
        DataText = "Clicked";
        OnPropertyChange(nameof(IsEnable));
        OnPropertyChange(nameof(DataText));
    }
}

通常,应该使用命令的CanExecute方法禁用Button ICommand接口的大多数实现都接受Predicate<object> ,可用于告诉命令何时启用命令/按钮。

在这种情况下,您可能只是从后面的代码中删除了事件处理程序,而只在视图模型中处理了命令:

<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" IsEnabled="{Binding IsEnable}" />

这应该起作用,因为您在命令的Execute方法中设置了IsEnable属性并引发了PropertyChanged事件。 当绑定到视图模型的命令时,通常不处理视图代码背后的Click事件。

如果使用命令的CanExecute方法,则无需绑定到IsEnable属性:

<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" />

查看模型:

private RelayCommand _enableCmd;
public RelayCommand Enable => _enableCmd ?? (_enableCmd = new RelayCommand(doEnable, x => _isEnabled));

private bool _isEnabled;
public string DataText { get; set; }

protected void doEnable(object obj)
{
    _isEnabled = true;
    Enable.RaiseCanExecuteChanged();
    DataText = "Clicked";
    OnPropertyChange(nameof(DataText));
}

由于您直接在代码中更改IsEnabled属性的值,因此后面的代码将中断绑定

可以使用:

(this.DataContext as ButtonEnableViewModel).IsEnable = false; 

或重组代码并更改viewModel本身中IsEnable属性的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM