C# 继电器命令WPF上的启用按钮
按钮未在命令enable、doEnable方法上获取enable。单击方法是禁用按钮。 按钮IsEnabled与ViewModel公共属性IsEnable绑定,该属性在doEnable上设置为true。 请告知以下代码中的错误 XAML:C# 继电器命令WPF上的启用按钮,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,按钮未在命令enable、doEnable方法上获取enable。单击方法是禁用按钮。 按钮IsEnabled与ViewModel公共属性IsEnable绑定,该属性在doEnable上设置为true。 请告知以下代码中的错误 XAML: <Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" Click="ButtonBase_OnClick" IsEnabled="{B
<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" Click="ButtonBase_OnClick" IsEnabled="{Binding IsEnable}" ></Button>
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;
}
}
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));
}
按钮EnableViewModel.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));
}
}
由于您正在更改
IsEnabled
属性的值,因此直接在代码中隐藏该属性会破坏您的绑定
或使用:
(this.DataContext as ButtonEnableViewModel).IsEnable = false;
或
重新构造代码并更改viewModel本身中IsEnable属性的值。通常应使用命令的
CanExecute
方法禁用按钮。ICommand
接口的大多数实现都接受一个谓词
,您可以使用它来告诉命令何时启用命令/按钮
在这种情况下,您可以简单地从代码隐藏中删除事件处理程序,然后只处理视图模型中的命令:
<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" IsEnabled="{Binding IsEnable}" />
查看模型:
<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" Click="ButtonBase_OnClick" IsEnabled="{Binding IsEnable}" ></Button>
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;
}
}
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));
}
“请告知以下代码中的错误”-这是一个混乱。为什么要混合代码隐藏和视图模型?您的按钮base_OnClick
将设置为启用
属性为false
,但您的启用
命令将相同属性设置为true
。您正在尝试做什么?尝试启用Button doEnable方法。这是一个可执行的示例,更改isEnabled属性的值直接中断binding@tabby如果它破坏了绑定,如何修复…@Akhter:您应该使用命令的CanExecute
方法禁用按钮。ICommand
接口的大多数实现都接受一个谓词
,您可以使用它来告诉命令何时启用命令/按钮。