如何解决在这种情况下是否需要 UpdateSourceTrigger=PropertyChanged?
讨论为什么这不是一个重复的问题
该问题已被视为与 this one 重复(引用为重复的 other question 更加模糊,并且没有指定按钮,而我有一个完全可重现的示例,其中包含所有所需的最少代码) .
有几件事要说。
首先是区别非常明显:在那个问题中有
<Button Command="{Binding MyCommand}" IsDefault="True"/>
那是多年前写的,上面的代码不会产生我下面描述的问题。我必须再次强调,在我的问题中,将按钮定义为 Focusable="False"
很重要。这就是我在答案中讨论的内容。
完整存储库
原始问题
我在 C# 中创建了一个新的 WPF .NET Framework(例如 4.8)项目。
我使用我的开源 nuget 包 GiulioMVVM 来更改属性的标准实现,但无论您喜欢什么,它都与问题无关。
在 XAML 设计器中,我引入了一个文本框、一个按钮和一个文本块。
在 viewmodel 中,我以通常的方式定义了 2 个标准的 PropertyA 和 PropertyB
private double myVara;
public double MyPropertyA
{
get { return myVara; }
set { myVara = value; OnPropertyChanged(); }
}
顺便说一下,OPropertyChanged()
是正确的,因为 I'm using
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
然后我设置绑定
<TextBox Text="{Binding MyPropertyA}"
<TextBlock Text="{Binding MyPropertyB}"
和
<Button Focusable="False" Command="{Binding DoubleCmd}"
简单的命令在哪里
DelegateCommand doubleCmd;
public ICommand DoubleCmd
{
get
{
if (doubleCmd is null)
{
doubleCmd = new DelegateCommand(_ =>
MyPropertyB = MyPropertyA * 2
);
}
return doubleCmd;
}
}
然后我开始测试,我看到,如果我更改一个值并立即单击按钮,该值不会正确刷新。
我认为要修复它我必须设置
<TextBox Text="{Binding MyPropertyA,UpdateSourceTrigger=PropertyChanged}"
(也许,to handle a double binding better than TextBox 我必须选择带有 Doubleupdown
控件的扩展工具包)
我的推理正确吗?还是XY problem?
回复评论
根据 Clemens 的评论,如果不添加另一个示例,则示例不自然
<TextBox Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="48" Margin="426,64,0" textwrapping="Wrap" Text="another TB so I can move focus" VerticalAlignment="Top" Width="419"/>
话虽如此,直接点击按钮 - 之前没有其他 TextBox 的选项卡 - 会产生上面描述的情况
EldHasp 建议使用命令参数,我的回答是,在我的 CRUD 应用程序业务场景中,此命令的输入实际上是 VM 的属性,这是有道理的,因为它由不同的相关命令共享,并且它实际上是 VM 逻辑的一部分。这是 long,extended discussion 的链接。
解决方法
我认为要修复它我必须设置
<TextBox Text="{Binding MyPropertyA,UpdateSourceTrigger=PropertyChanged}"
我的推理是否正确?
不,你在这里可能完全错了,魔鬼藏在细节中,你可能忽略了一个基本的细节。
您可以使按钮成为焦点,为什么要设置 Focusable="False"
?
真的需要吗?
你不能简单地删除它吗?
这确实是解决方案。事实是,真正的要求不是在用户键入 double 时发出通知,这没有意义,因为数字甚至没有完全键入。
真正的要求是将按钮的点击视为失去焦点事件。因此,将按钮设置为不可聚焦是完全错误的。
旁注
另一个有趣的点,对于那些喜欢在绑定中添加 ,UpdateSourceTrigger=PropertyChanged
的人。
在这种情况下,问题中的可用性问题 mentioned/linked 不仅可以通过扩展工具包或 ,Delay=500
解决,而且另一个选项也可以是 ,Mode=OneWayToSource
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。