标签停止的触发重新评估

时间:2018-03-20 16:32:37

标签: wpf xaml mvvm-light

我有一个基于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 &amp; New
</Button>

这里有两个视图模型在运行。第一个是父对象,显示的控件绑定到该父对象。第二个绑定到UserControl,它由父的PageControl属性公开(第二个视图模型绑定到UserControl&#39; s DataContext。 / p>

两个视图模型在幕后进行通信,第二个/子视图模型控制IsDirtyIsValid的父视图模型属性(这是基于评估子视图模型的更改而完成的)属性及其有效性)。从概念上讲,我想要发生的是:只要UserControl中的最后一个控件失去焦点,并且子视图模型IsDirtyIsValid,我希望焦点转移到Save&amp;新按钮。

实现此操作的一部分涉及向Save&amp;添加附加属性。新按钮,基于此SO article

这是support:FocusExtension ... XAML的基础。当UserControl中的最后一个控件失去焦点时,以及DefaultButtonIsSelectedIsValid的所有内容都会设置父视图模型属性IsDirty

不幸的是,虽然我可以看到附加属性中的焦点控制代码被调用,但是Save&amp;新按钮获得焦点,它会立即丢失(并且会调用该文章中的焦点丢失代码)。

我很确定这是由于WPF何时评估按钮IsEnabled属性的值。我之所以这么说是因为注释了多路转换器 - 所以按钮始终处于启用状态 - 让焦点设置控件按预期工作 - 焦点设置在按钮上,而不会丢失。

有没有办法强制WPF在Save&amp; amp;之后重新评估制表位。新按钮的IsEnabled属性发生了变化?我认为这可能会解决问题。当然,也欢迎其他想法。

0 个答案:

没有答案