【问题标题】:Enable Button on RelayCommand WPF在 RelayCommand WPF 上启用按钮
【发布时间】:2018-06-26 06:32:19
【问题描述】:

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

【问题讨论】:

  • “请告知以下代码有什么问题” - 真是一团糟。为什么要混合代码隐藏和视图模型?您的ButtonBase_OnClickIsEnabled 属性设置为false,但您的Enable 命令将相同的属性设置为true。你想做什么?
  • 尝试启用 Button doEnable 方法。它是一个可执行的例子,
  • 更改 isEnabled 属性的值会直接破坏绑定
  • @tabby 如果它破坏了绑定,如何修复它...
  • @Akhter:您应该使用命令的CanExecute 方法来禁用ButtonICommand 接口的大多数实现都接受Predicate&lt;object&gt;,您可以使用它来告诉命令何时启用命令/按钮。

标签: c# .net wpf mvvm


【解决方案1】:

您一般应该使用命令的CanExecute 方法来禁用ButtonICommand 接口的大多数实现都接受 Predicate&lt;object&gt;,您可以使用它来告诉命令何时启用命令/按钮。

在这种情况下,您可以简单地从代码隐藏中删除事件处理程序,并在视图模型中处理命令:

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

【讨论】:

    【解决方案2】:

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

    任意使用:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2013-07-16
      • 1970-01-01
      • 2012-12-16
      • 2015-04-19
      相关资源
      最近更新 更多