Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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#_Wpf_Binding - Fatal编程技术网

C# 带延迟的WPF绑定无法正常工作

C# 带延迟的WPF绑定无法正常工作,c#,wpf,binding,C#,Wpf,Binding,我正在尝试对WPF绑定使用Delay属性。在下面的示例中,有两个绑定到同一属性的文本框。第一个使用Delay属性,第二个不使用 这种延迟效果很好。但意外的行为是,更改TextBox1中的值不会立即启用按钮,但TextBox2会立即启用。鼠标单击、enter键或使用tab键离开文本框即可启用该按钮 有人知道我如何解决这个问题,或者原因是什么吗 视图: 我建议您的RelayCommand是microsoft的默认实现。因此,x=>Value1!=InitialValue是Func\u canExec

我正在尝试对WPF绑定使用Delay属性。在下面的示例中,有两个绑定到同一属性的文本框。第一个使用Delay属性,第二个不使用

这种延迟效果很好。但意外的行为是,更改TextBox1中的值不会立即启用按钮,但TextBox2会立即启用。鼠标单击、enter键或使用tab键离开文本框即可启用该按钮

有人知道我如何解决这个问题,或者原因是什么吗

视图:


我建议您的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();           
    }