2010-08-13 7 views
16

Я пытаюсь понять WPF и MVVM и добился хороших результатов. У WPF и MVVM стороны идут хорошо.Как отключить кнопку в WPF с использованием шаблона MVVM?

Однако XAML и привязки данных на стороне совершенно другая история :)

Как бы я идти о кнопку «отключить»?

Например, у меня есть свойство CanClose в моей модели просмотра, определяющее, может ли приложение в настоящее время быть закрыто. Если рабочий поток не выполняет что-то, тогда для этого свойства установлено значение false, и я хотел бы либо зачеркнуть кнопку, либо каким-то образом визуально отключить кнопку «Закрыть» с помощью какого-то привязки.

Как бы я это сделал?

Спасибо!

Edit -

Жаль, что я могу принимать только один ответ.

Эти два ответа очень помогли мне. В пост Кента, он пошел еще дальше, объясняя, почему вы должны реализовать команду инфраструктуры в приложении вместо того, чтобы отключить кнопки таким образом, что я спросил:

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, которую я пропускаю? –

+0

@IanP DelegateCommand является частью Prism, который, по-видимому, является де-факто способом написания приложений WPF в наши дни .... – BFree

+0

Хм .. Не зная, что делает DelegateCommand, это не помогает мне так сильно, как я надеялся .. lol –

31

Просто связать IsEnabled свойство Button в CanClose:

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

Ни в коем случае, это действительно так просто? Я понятия не имею, как я мог это забыть. Позвольте мне попробовать. –

+1

Спасибо, я не могу поверить, что упустил такой простой ответ на эту проблему. –

9

Если вы вернете CanExecute из ICommand значение false, тогда кнопка будет отключена. Итак, независимо от того, к какой команде привязана ваша кнопка, посмотрите, можете ли вы вернуть CanExecute значение false, если вы хотите его отключить.

+0

+1 Прямой ответ. Не знаю, почему этот ответ внизу. – rpattabi

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> 

ViewModel:

private bool _btnEnabled; 
    public bool btnEnabled 
    { 
     get { return _btnEnabled; } 
     set 
     { 
      if (_btnEnabled != value) 
      { 
       _btnEnabled = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
Смежные вопросы