在命令启用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));
}
}
答案 0 :(得分:2)
通常应使用命令的CanExecute
方法来禁用Button
。 ICommand
界面的大多数实现都接受Predicate<object>
,您可以使用它来告诉命令何时启用命令/按钮。
在这种情况下,您可能只是从后面的代码中删除了事件处理程序,而只在视图模型中处理了命令:
<Button Content="{Binding DataText}" Height="30" Width="80" Command="{Binding Enable}" IsEnabled="{Binding IsEnable}" />
这应该起作用,因为您在命令的IsEnable
方法中设置了Execute
属性并引发了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));
}
答案 1 :(得分:0)
由于您直接在代码中直接更改了meta.tag
属性的值,这会破坏您的绑定
可以使用:
IsEnabled
或 重构代码并更改viewModel本身中IsEnable属性的值。