RelayCommand WPF上的“启用”按钮

时间:2018-06-26 06:32:20

标签: c# .net wpf mvvm

在命令启用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));
    }
}

2 个答案:

答案 0 :(得分:2)

通常应使用命令的CanExecute方法来禁用ButtonICommand界面的大多数实现都接受Predicate<object>,您可以使用它来告诉命令何时启用命令/按钮。

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

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

这应该起作用,因为您在命令的IsEnable方法中设置了Execute属性并引发了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));
}

答案 1 :(得分:0)

由于您直接在代码中直接更改了meta.tag属性的值,这会破坏您的绑定

可以使用:

IsEnabled

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