Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继电器命令WPF上的启用按钮_C#_.net_Wpf_Mvvm - Fatal编程技术网

C# 继电器命令WPF上的启用按钮

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

按钮未在命令enable、doEnable方法上获取enable。单击方法是禁用按钮。 按钮IsEnabled与ViewModel公共属性IsEnable绑定,该属性在doEnable上设置为true。 请告知以下代码中的错误

XAML:

<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
接口的大多数实现都接受一个
谓词
,您可以使用它来告诉命令何时启用命令/按钮。