2015-03-05 5 views
2

Button.IsEnabled не работает должным образом.Кнопка IsEnabled не работает должным образом

Я отлаживал код, и установщик для свойства был поражен «истинным» значением. Но кнопка все еще отключена.

View.xaml:

<StackPanel Grid.Row="2" Margin="0,20,0,0" > 
     <Button Name="ButtonOk" Content="OK" Margin="0,0,4,0" IsEnabled="{Binding SomethingIsValid}" Command="{Binding CommandOk}" /> 
     <Button Name="ButtonCancel" Content="Cancel" Margin="0,0,4,0" IsCancel="True"/
</StackPanel> 

View.xaml.cs:

... 
public View(ViewModel viewModel) 
{ 
    this.InitializeComponent(); 

    this.viewModel = viewModel; 
    this.DataContext = viewModel;    
} 

ViewModel:

public bool SomethingIsValid 
{ 
    get 
    { 
     return somethingIsValid; 
    } 
    set 
    { 
     this.somethingIsValid= value; 
     this.RaisePropertyChanged(() => this.SomethingIsValid); 
    } 
} 

#region IDataErrorInfo 
public string this[string columnName] 
{ 
    get 
    { 
     this.SomethingIsValid= false; 

     if ("SomeName" == columnName) 
     { 
     if (string.IsNullOrEmpty(this.Status)) 
     { 
      return "Please bla bla.."; 
     } 
     } 

     this.SomethingIsValid = true; 
     return string.Empty; 
    } 
} 

public string Error 
{ 
    get 
    { 
     return string.Empty; 
    } 
} 
#endregion 

public ICommand CommandOk 
{ 
    get 
    { 
     if (this.commandOk == null) 
     { 
     this.commandOk = new RelayCommand(this.CommandOkAktion,() => this.SomethingIsValid); 
     } 

     return this.commandOk; 
    } 
} 
+2

Можете ли вы показать свою команду: 'CommandOk', обычно кнопка« Включить и отключить »управляется« CanCommandExecute », определенной в команде привязки. – Bolu

+1

Как указывает @Bolu, это может быть ваша команда, которая отключает кнопку (интерфейс ** ICommand ** имеет метод ** CanExecute **: если это возвращает 'false', кнопка, привязанная к команде, будет отключена) , –

+0

@Bolu Command Ok вызов модели и сохранение информации в DB – MikroDel

ответ

6

Если вы используете команду, это не очень хорошая идея, чтобы отдельно связать свойство IsEnabled кнопки. Вместо этого вы должны указать правильное значение в команде «CanExecute». Это также позволит кнопке.

+0

Спасибо за ответ! У меня есть upvoted :) Я отлаживал и CanExecute (true) было показано – MikroDel

+0

, если вы установите точку останова в метод CanExecute. Это действительно выполнено? Он оценивается только в том случае, если кнопка находится в области логического фокуса. –

+0

Я не знаю, что именно вы имеете в виду. Этот метод public bool CanExecute (параметр объекта) { return this.canExecute == null || this.canExecute(); } называется – MikroDel

0

Вы должны реализовать интерфейс INotifyPropertyChanged в вашем ViewModel, поэтому просмотр становится недоступным, когда свойство обновляется.

Посмотрите на это: https://msdn.microsoft.com/en-US/library/system.componentmodel.inotifypropertychanged%28v=vs.110%29.aspx

+0

Я думаю, что OP уже сделал это: 'this.RaisePropertyChanged (() => this.SomethingIsValid);' – Bolu

+0

Thank вы для вас ответ! Болу прав - я уже реализовал его и назову тоже. – MikroDel

+0

Да, я действительно новый здесь ... Первый урок: внимательно прочитайте образцы кода перед ответом. – Robin

1

формы, что я могу видеть в своем публикуемой коде, если ничего не вызывает this["SomeName"], ваш SomethingIsValid всегда будет false, и поэтому ваша кнопка показывает disabled. Поэтому мое предложение/решение:

Удалить IsEnabled связывание с XAML (как вы не будете нуждаться в этом, если ваша команда привязка работает корректно):

<StackPanel Grid.Row="2" Margin="0,20,0,0" > 
    <Button Name="ButtonOk" Content="OK" Margin="0,0,4,0" Command="{Binding CommandOk}" /> 
    <Button Name="ButtonCancel" Content="Cancel" Margin="0,0,4,0" IsCancel="True"/
</StackPanel> 

Изменить код ViewModel к чему-то, как показано ниже (ваш текущее определение команды в порядке, поэтому никаких изменений в этой части). Код ниже удостоверяется при выполнении CanCommandExecute, он будет повторно изучить SomethingIsValid:

public bool SomethingIsValid 
{ 
    get 
    { 
     return string.IsNullOrEmpty(Error); 
    } 
} 

public string this[string columnName] 
{ 
    get 
    { 
     switch(columnName) 
     { 
      case "SomeName": 
      { 
       if (string.IsNullOrEmpty(this.Status)) 
       { 
        return "Please bla bla.."; 
       } 
       break; 
      } 
      case "SomeOtherName": 
      { 
       if (string.IsNullOrEmpty(this.OtherProperty)) 
       { 
        return "Please bla bla.."; 
       } 
       break; 
      } 

     } 
     return string.Empty;   

    } 
} 

public string Error 
{ 
    get 
    { 
     return this["SomeName"]+this["SomeOtherName"]; 
    } 
} 
#endregion 
+0

Таким образом, кнопка OK не будет отображаться серым для пользователя (отключено). Я хочу, чтобы этого не произошло. – MikroDel

+0

@MikroDel, он не должен, поскольку, когда 'this.Status' пуст или пуст,' SomethingIsValid' вернет 'false'? пожалуйста, выполните некоторую отладку. – Bolu

+0

@MikroDel, проверьте [Основные примеры MVVM и ICommand] (http://www.codeproject.com/Articles/813345/Basic-MVVM-and-ICommand-usuage-example) (на всякий случай и убедитесь, что вы не хватает чего-то очевидного). – Bolu

-1

Я решил проблему путем связывания значения IsEnabled. Явно установить его в False не получилось.

Это сработало:

<Button Text="Login" Command="{Binding LoginCommand}" IsEnabled="{Binding ButtonsEnabled}" /> 

Это не сработало:

<Button Text="Login" Command="{Binding LoginCommand}" IsEnabled="False" /> 
0

Если кто-то все еще возникают проблемы с этим - убедитесь, что ваше имущество IsEnabled приходит после того, как свойства Command ,

<Button Command="{Binding StartCommand}" IsEnabled="{Binding StartEnabled}" /> 

- работает

<Button IsEnabled="{Binding StopEnabled}" Command="{Binding StopCommand}" /> 

- не работает

Обратите внимание, что обе мои команды всегда может выполнить. Более легкое решение для меня.

Смежные вопросы