2010-08-13 119 views
16

我试图掌握WPF和MVVM,并取得了良好的进展。 WPF和MVVM方面进展顺利。如何使用MVVM模式“禁用”WPF中的按钮?

然而,XAML和数据绑定侧是一个整体的其他故事:)

我怎么会去“禁用”按钮?

例如,我在我的视图模型中有一个CanClose属性,用于确定应用程序当前是否可以关闭。如果一个工作线程关闭了某个东西,那么这个属性设置为false,并且我想要将该按钮变灰,或者以某种方式通过某种绑定在视觉上禁用关闭按钮。

我该怎么做呢?

谢谢!

编辑 -

太糟糕了,我只能接受一个答案。

这两个答案帮了我很大的忙。在肯特的岗位上,他进一步去一步步的方式解释了为什么你应该实现在您的应用程序的命令的基础设施,而不是禁用一个按钮,我曾问:

How does one "disable" a button in WPF using the MVVM pattern?

而答案我原来的问题:

How does one "disable" a button in WPF using the MVVM pattern?

回答

28

通过使用命令模式。在您的视图模型:

public class MyViewModel : ViewModel 
{ 
    private readonly ICommand someCommand; 

    public MyViewModel() 
    { 
     this.someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething); 
    } 

    public ICommand SomeCommand 
    { 
     get { return this.someCommand; } 
    } 

    private void DoSomething(object state) 
    { 
     // do something here 
    } 

    private bool CanDoSomething(object state) 
    { 
     // return true/false here is enabled/disable button 
    } 
} 

在您的XAML:

<Button Command="{Binding SomeCommand}">Do Something</Button> 

阅读this post找到更多关于DelegateCommand

+0

尼斯链接,感谢您的信息。今天下午,当我获得一些额外的空闲时间时,我会阅读整件事情。我认为DelegateCommand是你自己的命令模式的实现,或者这是我在.net框架中丢失的东西吗? – 2010-08-13 12:44:35

+0

@IanP DelegateCommand是Prism的一部分,它似乎是现在编写WPF应用程序的事实上的方式...... – BFree 2010-08-13 12:51:24

+0

嗯..不知道DelegateCommand做了什么,这并没有像我希望的那样帮助我。大声笑 – 2010-08-13 12:56:20

31

只是按钮的IsEnabled属性绑定到CanClose:

<Button IsEnabled="{Binding CanClose}"/> 
+0

没办法,是不是真的那么容易吗?我不知道我怎么可能忽略这一点。让我试试看。 – 2010-08-13 12:21:17

+1

谢谢,我不能相信我忽视了这个问题的简单答案。 – 2010-08-13 12:23:26

9

如果您返回CanExecute of ICommand值为false,则Button将被禁用。因此,无论您的按钮绑定的命令是什么,查看当您想禁用它时是否可以返回CanExecute的值为false。

+0

+1直接回答。不知道为什么这个答案是在底部。 – rpattabi 2014-06-09 13:18:32

1

这工作太:

查看

 <Button> 
      <Button.Style> 
       <Style> 
        <Setter Property="Content" Value="Scream" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding btnEnabled}" Value="True"> 
          <Setter Property="IsEnabled" Value="True" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button> 

视图模型

private bool _btnEnabled; 
    public bool btnEnabled 
    { 
     get { return _btnEnabled; } 
     set 
     { 
      if (_btnEnabled != value) 
      { 
       _btnEnabled = value; 
       OnPropertyChanged(); 
      } 
     } 
    }