XAML 延迟绑定和按键绑定

XAML Binding with Delay and KeyBinding

我有这个 XAML 代码,非常有用:

<TextBox Text="{Binding MyTextProperty, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding MyOwnCommand}" CommandParameter="{Binding MyTextProperty}" Key="Enter" />
    </TextBox.InputBindings>
</TextBox>

当我按回车键时,我有 MyTextProperty 作为参数传递给 MyOwnCommand

我不希望每次输入字母时 MyTextProperty 更新(因为它有一些相关的逻辑),但我确实希望它在我完成输入后执行(不按回车键或失去焦点) .理想的解决方案是:

<TextBox Text="{Binding MyTextProperty, UpdateSourceTrigger=PropertyChanged, Delay=400}">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding MyOwnCommand}" CommandParameter="{Binding MyTextProperty}" Key="Enter" />
    </TextBox.InputBindings>
</TextBox>

这里的重点是"Delay=400"参数。它等到我完成输入然后更新 MyTextProperty.

但是我此时发现的问题是,如果我输入一些东西并立即回车,MyOwnCommand被调用但MyTextProperty还没有更新(它会在400ms后更新)。

我曾尝试在 CommandParameter="{Binding MyTextProperty, Delay=400}" 中添加相同的延迟,但它不起作用。

更新 MyTextProperty 后传递 CommandParameter 的正确方法是什么?

TextBox.Text 在用户从键盘键入符号后立即更改,即使将值发送到绑定 属性 有延迟。所以可以直接绑定CommandParameter到TextBox.Text:

<TextBox Name="MyTextBox" 
         Text="{Binding MyTextProperty, UpdateSourceTrigger=PropertyChanged, Delay=400}">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding MyOwnCommand}" 
                    CommandParameter="{Binding Text, ElementName=MyTextBox}" 
                    Key="Enter" />
    </TextBox.InputBindings>
</TextBox>

but I do want it executes once I finish typing

我会将这个 属性 分成不同的属性。然后只有 enter 命令提取最终值,在最后 属性 中设置并执行最后一步。


// bound to the active textbox, which receives character by character changes
public string MyTextProperty { get { ... } 
                               set { ...do individual key press logic here... }

public string MyTextProperty_Final  { }

public void EnterCommand()
{
  MyTextProperty_Final = MyTextProperty;
  FinalOperationCommand(MyTextProperty_Final); // Or FinalOperationCommand.Invoke(MyTextProperty_Final);
}

public void FinalOperationCommand(string text)
{
   ... delay if needed ...
   ... Do stuff with MyTextProperty_Final
}