WPF/MVVM:禁用按钮';UserControl后面的ViewModel尚未初始化时的状态?

WPF/MVVM:禁用按钮';UserControl后面的ViewModel尚未初始化时的状态?,wpf,button,icommand,Wpf,Button,Icommand,我有一个DocumentListView.Xaml,带有一个列表框和3个按钮 在UserControl后面是一个DocumentListViewModel,它有3个按钮,它们的Command属性绑定到3个RelayCommand 我有3个控制器,如管理控制器、计费控制器、报表控制器 每个控制器都有可观察到的集合,如客户1:N订单1:N文档,对于另一个控制器也是如此 在一个控制器中,我有一个特殊的绑定情况。如果我的DocumentListViewModel没有被其父视图模型(如OrderViewM

我有一个DocumentListView.Xaml,带有一个列表框和3个按钮

在UserControl后面是一个DocumentListViewModel,它有3个按钮,它们的Command属性绑定到3个RelayCommand

我有3个控制器,如管理控制器、计费控制器、报表控制器

每个控制器都有可观察到的集合,如客户1:N订单1:N文档,对于另一个控制器也是如此

在一个控制器中,我有一个特殊的绑定情况。如果我的DocumentListViewModel没有被其父视图模型(如OrderViewModel)初始化(因为没有加载/存在任何订单),则我的UserControl有3个启用的按钮。好的,用户可以按下3个按钮,但什么也没有发生,但仍然非常混乱,最重要的是,我的用户界面的一致性消失了

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

将按钮IsEnabled属性设置为false没有帮助,因为按钮将永远处于禁用状态。没有CanExecute TRUE会将其设置为IsEnabled=TRUE


我不想介绍另一个属性是ButtonneEnabled。。。这太愚蠢了,因为我的按钮逻辑后面有winforms和wpf两个世界。。。我命令应该足够了。

这是一个有趣的情况。老实说,我从来没有遇到过这样的情况:用户界面是加载的和交互的,但是ViewModel还没有绑定

但是,暂时忽略这一点,您可能会在绑定上使用一个fallback值来绑定到全局可用的NullCommand或某个总是为其CanExecute方法返回false的对象

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

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

<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>


根据您的风格,IsEnabled属性如何设置为TRUE?只要未命中触发器,就会调用正常过程。即,当设置命令属性且CanExecute的计算结果为true时。有效!这才是最重要的!谢谢小妖精。没问题:-)很高兴我能帮上忙!问题是我的DocumentListView是一个用户控件,使用了3次。当I do Command=“{Binding SaveCommand,FallbackValue={x:Null}}”/>保存按钮仍处于启用状态。但是我想通过命令来禁用它。好的,我的示例依赖于一个全局可用的NullCommand,而不是x:Null值,正如您所指出的,它将启用按钮。无论如何,Goblin的解决方案可能更容易实现。这是一个非常好的解决方案,特别是对于Silverlight。