gpt4 book ai didi

c# - WPF MVVM : TextBox needing format and Button with IsDefault set to True

转载 作者:行者123 更新时间:2023-12-03 10:50:56 26 4
gpt4 key购买 nike

我找到了这个 link关于类似的问题,除了我的文本框增加了在焦点丢失后需要格式化的值。

<TextBox Text="{Binding Value}" MaxLength="{Binding MaskLength}"/>
<Button Command="{Binding ExecuteCommand}" IsDefault="True"/>

用户在文本框中输入文本后,我想使用用户定义的掩码对其进行格式化。例如,如果掩码是“00000”,则约定是右对齐和零填充。

123 => 00123
A01 => 00A01
etc...



我遇到的问题是,当用户完成输入时,我应该只格式化一次文本。当前,如果用户单击按钮,则用户输入的值被推送到绑定(bind)并执行命令。但是,如果他们按下“Enter”键,则不会将值推送到绑定(bind),并且仍会执行命令。

当用户按下回车键时,我发现如何推送绑定(bind)的唯一方法是更改​​文本框的绑定(bind)并指定 UpdateSourceTrigger=PropertyChanged .这不能很好地工作,因为我实际上不知道用户何时完成输入他们的文本。

最简单的解决方案是添加代码隐藏以在按下回车键时设置按钮的焦点,但是我希望焦点保持在它们当前所在的文本框中。有没有人有办法解决这个问题,也许是附加属性(property)?

编辑:

这是我的 View 模型如何格式化输入值的简短示例。
public string Value
{
get
{
return mFieldValue;
}
set
{
SetValueAndRaisePropertyChange(
ref mFieldValue,
_ApplyFormat( value ),
() => FieldValue );
}
}

这是我发现的最简洁的 hack 代码。我把它变成了一个附属的属性(property),但它仍然闻起来不太对劲。
private void _HandleTxtKeyDown( object sender, KeyEventArgs e )
{
if( e.Key == Key.Enter )
{
TextBox textBox = (TextBox)sender;
BindingExpression binding = textBox.GetBindingExpression( TextBox.TextProperty );
if( binding != null )
{
binding.UpdateSource();
}
}
}

最佳答案

如果我以正确的方式理解您的意图,那么实际上没有问题。

如果用户按下回车键/单击按钮,您只想屏蔽输入吗?然后,您已经找到的解决方案 (UpdateSourceTrigger=PropertyChanged) 将完全按照您的意图进行。在您键入时,您的 VM 中的属性会更新。如果您使用 PropertyChanged 触发器,则在您按下回车键/单击按钮之前,该命令不会被执行。

默认的 UpdateSourceTrigger 是“LostFocus”。当然,如果您用鼠标单击按钮,而不是按 Enter 键时,也会发生这种情况。

希望我能帮助你理解机制。

关于c# - WPF MVVM : TextBox needing format and Button with IsDefault set to True,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3610134/

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