我有一个基于MVVM Light的WPF应用程序,我根据视图模型条件设置了对特定按钮的关注时遇到问题。
以下是相关的XAML:
<ContentControl Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
IsTabStop="False"
Content="{Binding PageControl, Mode=OneWay}"
Name="ctlCurrent"/>
<Button Style="{DynamicResource MaoStandardButton}"
IsDefault="True"
support:FocusExtension.IsFocused="{Binding DefaultButtonIsSelected}"
TabIndex="1">
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource AllTrueConverter}">
<Binding Path="IsDirty"/>
<Binding Path="IsValid"/>
</MultiBinding>
</Button.IsEnabled>
Save & New
</Button>
这里有两个视图模型在运行。第一个是父对象,显示的控件绑定到该父对象。第二个绑定到UserControl
,它由父的PageControl属性公开(第二个视图模型绑定到UserControl
&#39; s DataContext
。 / p>
两个视图模型在幕后进行通信,第二个/子视图模型控制IsDirty
和IsValid
的父视图模型属性(这是基于评估子视图模型的更改而完成的)属性及其有效性)。从概念上讲,我想要发生的是:只要UserControl中的最后一个控件失去焦点,并且子视图模型IsDirty
和IsValid
,我希望焦点转移到Save&amp;新按钮。
实现此操作的一部分涉及向Save&amp;添加附加属性。新按钮,基于此SO article。
这是support:FocusExtension
... XAML的基础。当UserControl中的最后一个控件失去焦点时,以及DefaultButtonIsSelected
和IsValid
的所有内容都会设置父视图模型属性IsDirty
。
不幸的是,虽然我可以看到附加属性中的焦点控制代码被调用,但是Save&amp;新按钮获得焦点,它会立即丢失(并且会调用该文章中的焦点丢失代码)。
我很确定这是由于WPF何时评估按钮IsEnabled
属性的值。我之所以这么说是因为注释了多路转换器 - 所以按钮始终处于启用状态 - 让焦点设置控件按预期工作 - 焦点设置在按钮上,而不会丢失。
有没有办法强制WPF在Save&amp; amp;之后重新评估制表位。新按钮的IsEnabled
属性发生了变化?我认为这可能会解决问题。当然,也欢迎其他想法。