在这种情况下是否需要 UpdateSourceTrigger=PropertyChanged?

如何解决在这种情况下是否需要 UpdateSourceTrigger=PropertyChanged?

讨论为什么这不是一个重复的问题

该问题已被视为与 this one 重复(引用为重复的 other question 更加模糊,并且没有指定按钮,而我有一个完全可重现的示例,其中包含所有所需的最少代码) .

有几件事要说。

首先是区别非常明显:在那个问题中有

<Button Command="{Binding MyCommand}" IsDefault="True"/>

那是多年前写的,上面的代码不会产生我下面描述的问题。我必须再次强调,在我的问题中,将按钮定义为 Focusable="False" 很重要。这就是我在答案中讨论的内容

完整存储库

此外,简单、完整的源代码在此 repo 中。

原始问题

我在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?