gpt4 book ai didi

c# - WPF 延迟绑定(bind)无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-03 13:09:21 34 4
gpt4 key购买 nike

我正在尝试将延迟属性用于 WPF 绑定(bind)。在以下示例中,两个文本框绑定(bind)到同一属性。第一个使用延迟属性,第二个不使用。

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

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

查看:

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBox x:Name="TextBox1" Text="{Binding Value1, UpdateSourceTrigger=PropertyChanged, Delay=1000}"/>
<TextBox x:Name="TextBox2" Text="{Binding Value1, UpdateSourceTrigger=PropertyChanged}"/>
<Button Command="{Binding ButtonCommand}" Content="GO!"></Button>
</StackPanel>

代码隐藏:

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));
}
}

最佳答案

问题是 WPF 命令系统“CanExecute”检查是由 Control 事件触发的,而不是由 ViewModel 中的更改触发的。

那么发生的事情是您输入一个数字,触发一个事件。绑定(bind)触发响应,但由于延迟,它不会立即更新 ViewModel 属性。

不幸的是,命令的“CanExecute”检查(RelayCommand 构造函数第二个参数中的委托(delegate))也会响应您输入的数字和 Value1 尚未更改,因此按钮保持灰色,因为 Value1 仍等于初始值。一旦延迟过去并且 Value1 发生变化,“CanExecute”就不会重新检查。

您可以将 CommandManager.InvalidateRequerySuggested(); 添加到您的 Value1 setter 中,它应该可以工作:

    set
{
_value1 = value;
OnPropertyChanged();
CommandManager.InvalidateRequerySuggested();
}

关于c# - WPF 延迟绑定(bind)无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29674605/

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