WPF / MVVM:当UserControl后面的ViewModel尚未初始化时,禁用Button状态?

时间:2010-12-12 20:07:48

标签: wpf button icommand

我有一个带有ListBox和3个按钮的DocumentListView.Xaml。

在UserControl后面是一个带有3个按钮的DocumentListViewModel,它们的命令属性绑定到3个RelayCommands。

我有3个Controller,如AdministrationController,BillingController,ReportController。

每个控制器都有ObservableCollections,例如客户1:N订单1:N文档与其他控制器相同。

在一个控制器中,我有一个特殊的绑定情况。当我的DocumentListViewModel未被其父ViewModel(如OrderViewModel)初始化时(因为没有加载/存在订单),那么我的UserControl有3个按钮,它们是ENABLED。好的,用户可以按下3个按钮,但没有任何反应,但仍然令人困惑,最重要的是我的用户界面的一致性已经消失。

如何将按钮的命令设置为默认为“已禁用”?

将按钮IsEnabled属性设置为false无效,因为该按钮将永远保持在禁用状态。否CanExecute TRUE会将其设置为IsEnabled = true。

而且我不想引入另一个属性IsButtonEnabled ...那个愚蠢因为那时我的两个世界winforms和wpf在我的按钮逻辑后面...... ICommand应该就够了。

2 个答案:

答案 0 :(得分:19)

或者您可以使用按钮样式禁用:

<Style TargetType="{x:Type Button}" x:Key="DisablerButton">
    <Style.Triggers>
        <Trigger Property="Command" Value="{x:Null}">
            <Setter Property="IsEnabled" Value="False" />
        </Trigger>
    </Style.Triggers>
</Style>

答案 1 :(得分:5)

这是一个有趣的情况。老实说,我从来没有遇到过加载UI和交互式的情况,但ViewModel尚未绑定。

但是,暂时忽略这一点,您可能会在绑定上使用FallbackValue绑定到全局可用的NullCommand或其CanExecute方法始终返回false的内容。

<Button Command="{Binding SaveCommand, FallbackValue={StaticResource NullCommand}}" />