[英]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.