gpt4 book ai didi

c# - 在 RelayCommand WPF 上启用按钮

转载 作者:行者123 更新时间:2023-12-03 10:22:19 28 4
gpt4 key购买 nike

按钮未在命令启用、doEnable 方法上启用。单击方法是禁用按钮。
按钮 IsEnabled 与 ViewModel 公共(public)属性 IsEnable 绑定(bind),该属性在 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 的大多数实现接口(interface)接受 Predicate<object>您可以使用它来告诉命令何时启用命令/按钮。

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

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

这应该可以工作,因为您设置了 IsEnable Execute 中的属性(property)命令的方法并提出 PropertyChanged事件。你一般不处理 Click当您绑定(bind)到 View 模型的命令时, View 代码隐藏中的事件。

如果您使用 CanExecute命令的方法,你不需要绑定(bind)到 IsEnable属性(property):
<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));
}

关于c# - 在 RelayCommand WPF 上启用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51036252/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com