C# 带延迟的WPF绑定无法正常工作
我正在尝试对WPF绑定使用Delay属性。在下面的示例中,有两个绑定到同一属性的文本框。第一个使用Delay属性,第二个不使用 这种延迟效果很好。但意外的行为是,更改TextBox1中的值不会立即启用按钮,但TextBox2会立即启用。鼠标单击、enter键或使用tab键离开文本框即可启用该按钮 有人知道我如何解决这个问题,或者原因是什么吗 视图:C# 带延迟的WPF绑定无法正常工作,c#,wpf,binding,C#,Wpf,Binding,我正在尝试对WPF绑定使用Delay属性。在下面的示例中,有两个绑定到同一属性的文本框。第一个使用Delay属性,第二个不使用 这种延迟效果很好。但意外的行为是,更改TextBox1中的值不会立即启用按钮,但TextBox2会立即启用。鼠标单击、enter键或使用tab键离开文本框即可启用该按钮 有人知道我如何解决这个问题,或者原因是什么吗 视图: 我建议您的RelayCommand是microsoft的默认实现。因此,x=>Value1!=InitialValue是Func\u canExec
我建议您的RelayCommand是microsoft的默认实现。因此,
x=>Value1!=InitialValue
是Func\u canExecute
条件
在“canExecute-condition”更改后,您可能需要引发
RelayCommand
的RaiseCanecuteChanged
事件。这并不酷,但我认为应该可以工作。问题在于,WPF指挥系统“CanExecute”检查是由控制
事件触发的,而不是由ViewModel中的更改触发的
因此,所发生的是,您输入一个数字,触发一个事件。绑定会触发响应,但由于延迟,它不会立即更新ViewModel属性
不幸的是,命令的“CanExecute”检查(您的RelayCommand
构造函数的第二个参数中的委托)也会在您输入数字时发生,并且Value1
尚未更改,因此按钮保持灰色,因为Value1
仍然等于初始值。一旦延迟通过且Value1
发生变化,则不会重新检查“CanExecute”
您可以添加CommandManager.invalidateRequestSuggested()代码>到您的值1
设置器,它应该可以工作:
set
{
_value1 = value;
OnPropertyChanged();
CommandManager.InvalidateRequerySuggested();
}
public partial class MainWindow : Window, INotifyPropertyChanged
{
private const decimal InitialValue = 400;
private decimal _value1;
public decimal Value1
{
get { return _value1; }
set
{
_value1 = value;
OnPropertyChanged();
}
}
public ICommand ButtonCommand { get; set; }
public MainWindow()
{
InitializeComponent();
Value1 = InitialValue;
ButtonCommand = new RelayCommand(x => { /*Do something*/ }, x => Value1 != InitialValue);
DataContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
set
{
_value1 = value;
OnPropertyChanged();
CommandManager.InvalidateRequerySuggested();
}