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
}
我有这个 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
}