WPF默认按钮命令未触发文本框中的绑定

WPF默认按钮命令未触发文本框中的绑定,wpf,mvvm,binding,Wpf,Mvvm,Binding,我有一个带有一些文本框的搜索屏幕和一个默认的搜索按钮。如果我输入一个文本框并点击按钮,一切都很好。但是,如果在文本框内按enter键,按钮命令将启动,但我所在的文本框上的绑定不会启动,因此我的条件不会使其进入视图模型进行过滤 我知道有一种修复方法是将文本框上的绑定设置为PropertyChanged,但这似乎有点过头了。我可能在viewmodel中有逻辑做一些事情,我不希望每次击键都触发这种逻辑 我真正想要的是按钮本身触发焦点改变或以某种方式触发绑定。或者,如果焦点丢失,或者我按enter键,或

我有一个带有一些文本框的搜索屏幕和一个默认的搜索按钮。如果我输入一个文本框并点击按钮,一切都很好。但是,如果在文本框内按enter键,按钮命令将启动,但我所在的文本框上的绑定不会启动,因此我的条件不会使其进入视图模型进行过滤

我知道有一种修复方法是将文本框上的绑定设置为PropertyChanged,但这似乎有点过头了。我可能在viewmodel中有逻辑做一些事情,我不希望每次击键都触发这种逻辑


我真正想要的是按钮本身触发焦点改变或以某种方式触发绑定。或者,如果焦点丢失,或者我按enter键,或者从任何位置执行命令,则要使textbox触发绑定,一种方法是使用BindingGroup

如果文本框和按钮都包含在一个网格中(例如),您可以添加如下BindingGroup:

<Grid>
    <Grid.BindingGroup>
        <BindingGroup Name="bindingGroup1"/>
    </Grid.BindingGroup>

按钮。单击事件在CommandBinding之前触发,因此,在执行视图模型命令之前,该BindingGroup中的任何数据绑定文本框或任何其他数据绑定控件都应该更新。

我遇到了您刚才提到的确切情况。我使用的技巧是一种附加行为,它位于控件上并侦听PreviewKeyDown事件。它检查是否正在按enter键。如果是这样,则会强制控件失去焦点,从而导致在命令执行之前触发绑定。

一种更简单的方法(而不是使用绑定组)是使用默认按钮的单击事件将焦点设置为自身。由于这是在执行命令之前发生的,这意味着ViewModel会及时更新

private void button1_Click(object sender, RoutedEventArgs e)
{
    (sender as Button).Focus()
}

如果你真的讨厌代码隐藏,你可以写一个附加属性…

不能让它工作。我所做的是在最高级别创建一个绑定组,即从UserControl继承的ViewBase类。所有的文本框和按钮显然都在这里。我已经验证了在我的viewmodel获得命令之前触发的click事件,并且我已经验证了按钮具有与顶层相同的BindingGroup,但是CommittedIt没有获得要绑定回我的viewmodel的文本框中的任何内容。我真的很喜欢这个解决方案,我只是希望它能起作用!事实上,这确实有效!!!!问题是我在ViewBase loaded事件中创建BindingGroup。我把它移到了构造函数中,现在这个方法可以工作了!不再改变焦点<代码>(发送者作为FrameworkElement)。BindingGroup为空(在.NET 4下的UserControl中),所以我给grid命名并作为MyGrid.BindingGroup.CommittedIt()使用此方法有效。现在在我的click事件处理程序中,我使用Keyboard.FocusedElement获取当前聚焦的元素,然后将焦点设置为按钮,然后将焦点设置回原来的位置。这是可行的,但我不喜欢看到焦点改变。我希望上面的解决方案能起作用。现在我已经让上面的解决方案起作用了,我已经切换到它了。谢谢你的主意!
private void button1_Click(object sender, RoutedEventArgs e)
{
    (sender as Button).Focus()
}