在绑定数据变化时手动触发UI状态检查
xml
<Window x:Class="WpfApp5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp5"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Content="点击"
Command="{Binding ClickCommand}"
Margin="10" Padding="15" />
<Button Content="Sub"
Command="{Binding ClickCommandSub}"
Margin="10" Padding="15" />
<TextBlock Text="{Binding Count, StringFormat='已点击次数: {0}'}"
HorizontalAlignment="Center" Width="80" Margin="10"/>
</StackPanel>
</Window>
csharp
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
}
}
public class ManualRelayCommand : ICommand
{
private readonly Action<object> _execute;
private readonly Func<object, bool> _canExecute;
public ManualRelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter) => _canExecute?.Invoke(parameter) ?? true;
public void Execute(object parameter) => _execute(parameter);
// 手动触发事件
public event EventHandler CanExecuteChanged;
public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
//public event EventHandler CanExecuteChanged
//{
// add => CommandManager.RequerySuggested += value;
// remove => CommandManager.RequerySuggested -= value;
//}
同时保留手动触发方法
//public void ForceRaiseCanExecuteChanged() => CommandManager.InvalidateRequerySuggested();
}
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private int _count;
public int Count
{
get => _count;
set
{
if (_count == value) return;
_count = value;
OnPropertyChanged();
// 手动触发命令状态更新
ClickCommand.RaiseCanExecuteChanged();
}
}
public ManualRelayCommand ClickCommand { get; }
public ICommand ClickCommandSub
{
get { return new ManualRelayCommand(_ => Count--, _ => true); }
set { }
}
public MainViewModel()
{
ClickCommand = new ManualRelayCommand(
ClickEvent,
_CanExecute
);
}
private void ClickEvent(object obj)
{
Count++;
}
private bool _CanExecute(object arg)
{
return Count < 3;
}
}