gpt4 book ai didi

WPF TextBox 值不会在 OnPropertyChanged 上更改

转载 作者:行者123 更新时间:2023-12-04 14:20:04 25 4
gpt4 key购买 nike

我有一个 TextBox,其值绑定(bind)到 ViewModel 属性:

        <TextBox Name="txtRunAfter" Grid.Column="4" Text="{Binding Mode=TwoWay, Path=RunAfter}" Style="{StaticResource TestStepTextBox}"/>

设置和获取工作正常,直到我尝试在设置值时添加一些验证:
    private int _runAfter = 0;
public string RunAfter
{
get
{
return _runAfter.ToString();
}

set
{
int val = int.Parse(value);

if (_runAfter != val)
{
if (val < _order)
_runAfter = val;
else
{
_runAfter = 0;
OnPropertyChanged("RunAfter");
}
}
}
}

虽然达到了 OnPropertyChanged(我已经调试过了),但 View 没有改变。
我怎样才能使这项工作?

谢谢,
何塞·塔瓦雷斯

最佳答案

问题是您正在更新 Binding 的源代码。而 Binding正在更新您的资源。 WPF 在引发 PropertyChanged 时实际上不会检查您的属性值。响应 Binding 的事件更新。您可以使用 Dispatcher 来解决此问题。延迟该分支中事件的传播:

set
{
int val = int.Parse(value);

if (_runAfter != val)
{
if (val < _order)
{
_runAfter = val;
OnPropertyChanged("RunAfter");
}
else
{
_runAfter = 0;
Dispatcher.CurrentDispatcher.BeginInvoke(
new Action<String>(OnPropertyChanged),
DispatcherPriority.DataBind, "RunAfter");
}
}
}

更新:

我注意到的另一件事是 Binding在您的 TextBox 上正在使用默认 UpdateSourceTrigger ,当 TextBox失去焦点。在 TextBox 之后,您不会看到文本变回 0。在这种模式下失去焦点。如果您将其更改为 PropertyChanged ,您会立即看到这种情况发生。否则,直到您的 TextBox 才会设置您的属性。失去焦点:
<TextBox Name="txtRunAfter" Grid.Column="4" Text="{Binding RunAfter, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource TestStepTextBox}"/>

关于WPF TextBox 值不会在 OnPropertyChanged 上更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3055826/

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