目前我将TextBox
es绑定为:
Text="{Binding DocValue,
Mode=TwoWay,
ValidatesOnDataErrors=True,
UpdateSourceTrigger=PropertyChanged}"
这可以很好地让每次按键进行按钮状态检查(我想要)。
此外,我想跟踪LostFocus
上的TextBox
事件(通过绑定)并执行一些额外的计算,这些计算对于每次击键都可能过于密集。
任何人都有关于如何完成两者的想法?
答案 0 :(得分:18)
将命令绑定到TextBox
LostFocus
事件。
XAML
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<TextBox Margin="0,287,0,0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<i:InvokeCommandAction Command="{Binding LostFocusCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
查看模型
private ICommand lostFocusCommand;
public ICommand LostFocusCommand
{
get
{
if (lostFocusCommand== null)
{
lostFocusCommand= new RelayCommand(param => this.LostTextBoxFocus(), null);
}
return lostFocusCommand;
}
}
private void LostTextBoxFocus()
{
// do your implementation
}
您必须为此引用System.Windows.Interactivity
。并且您必须安装可再发行组件才能使用此库。您可以从here
答案 1 :(得分:2)
为补充投票最高的答案,dotnet核心已迁移了交互库。使此工作正常的步骤:
- 删除对“ Microsoft.Expression.Interactions”和“ System.Windows.Interactivity”的引用
- 安装“ Microsoft.Xaml.Behaviors.Wpf” NuGet程序包。
- XAML文件–用“ http://schemas.microsoft.com/expression/2010/interactivity”替换xmlns名称空间“ http://schemas.microsoft.com/expression/2010/interactions”和“ http://schemas.microsoft.com/xaml/behaviors”
- C#文件–用“ Microsoft.Xaml.Behaviors”替换c#文件“ Microsoft.Xaml.Interactivity”和“ Microsoft.Xaml.Interactions”中的用法
答案 2 :(得分:1)
我想我找到了一个解决方案......我创建了一个复合命令,并将其用于其他通信。
命令定义
public static CompositeCommand TextBoxLostFocusCommand = new CompositeCommand();
我的文本框
private void TextboxNumeric_LostFocus(object sender, RoutedEventArgs e)
{
if (Commands.TextBoxLostFocusCommand.RegisteredCommands.Count > 0)
{
Commands.TextBoxLostFocusCommand.Execute(null);
}
}
然后在我的ViewModel中,我创建了一个委托命令并连接到它..
似乎它正在发挥作用,想知道是否有更好的方法。对此的一个缺点是每个文本框都会触发这个,而不仅仅是我附加到我想要计算的公式的项目。可能需要考虑改进方法。