2010-08-13 56 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(); 
      } 
     } 
    } 
相關問題