2010-12-11 7 views
0

J'ai un problème avec la gestion des erreurs en vue. J'utilise caliburn.micro et MEF.Traitement des erreurs dans WPF-MVVM/bouton désactivé

regard Ma machine virtuelle comme ceci:

[Export(typeof(IShellViewModel))] 
public class ShellViewModel : PropertyChangedBase, IShellViewModel,IDataErrorInfo 
{ 

    #region Private members 

    private User _user; 
    private Dictionary<string, bool> _validProperties; 
    private bool _allPropertiesValid; 

    #endregion 

    #region Private methods 

    private void ValidateProperties() 
    { 
     if (_validProperties.Values.Any(isValid => !isValid)) 
     { 
      AllPropertiesValid = false; 
      return; 
     } 
     AllPropertiesValid = true; 
    } 
    #endregion 

    #region Constructor 

    public ShellViewModel() 
    { 
     _user = new User(); 
     _validProperties = new Dictionary<string, bool> {{"Nick", false}, {"Password", false}}; 
    } 

    #endregion 

    #region Properties 

    public bool AllPropertiesValid 
    { 
     get { return _allPropertiesValid; } 
     set 
     { 
      if (_allPropertiesValid != value) 
      { 
       _allPropertiesValid = value; 
       NotifyOfPropertyChange("AllPropertiesValid"); 
      } 
     } 
    } 

    #endregion 

    #region Implementation of IShellViewModel 

    public string Nick 
    { 
     get { return _user.Nick; } 
     set 
     { 
      _user.Nick = value; 
      NotifyOfPropertyChange("Nick"); 
     } 
    } 

    public string Password 
    { 
     get { return _user.Password; } 
     set 
     { 
      _user.Password = value; 
      NotifyOfPropertyChange("Password"); 
     } 
    } 

    public void EmptyLogOn() 
    { 
     MessageBox.Show(string.Format("LogOn on server with credential: {0}, {1}", Nick, Password)); 
    } 

    public void LogOn(string nick, string password) 
    { 

     MessageBox.Show(string.Format("LogOn on server with credential: {0}, {1}", nick, password)); 
    } 

    #endregion 

    #region Implementation of IDataErrorInfo 

    public string Error 
    { 
     get { return (_user as IDataErrorInfo).Error; } 
    } 

    public string this[string propertyName] 
    { 
     get 
     { 
      string error = (_user as IDataErrorInfo)[propertyName]; 
      _validProperties[propertyName] = String.IsNullOrEmpty(error) ? true : false; 
      ValidateProperties(); 
      CommandManager.InvalidateRequerySuggested(); 
      return error; 
     } 
    } 

    #endregion 
} 

Si j'ai erreur som je définir les propriétés AllPropertiesValid sur faux. Je lie ces propriétés sur les propriétés du bouton IsEnabled.

Donc Voir j'ai ceci:

<Button IsEnabled="{Binding AllPropertiesValid, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
     Micro:Message.Attach="EmptyLogOn" 
     Content="Prihlás ma" 
     Width="100" 
     Height="25" 
     VerticalAlignment="Center" 
     Grid.Row="2" 
     Grid.ColumnSpan="2"></Button> 
<Label Content="{Binding AllPropertiesValid}" Grid.Row="3"/> 

Mais si les propriétés AllPropertiesValid est faux bouton est toujours activé. Je vérifie la valeur de AllPropertiesValid (je lie ces propriétés sur l'étiquette et le contenu de l'étiquette est faux) est faux.

Qu'est-ce qui ne va pas? Merci d'avance.

EDIT: Dans le concepteur, le bouton est désactivé, mais lorsque le bouton de fenêtre chargé est activé.

Répondre

1

Si vous faites MVVM alors vous devriez utiliser ICommand (ou d'autres variantes plus haut niveau tels que CommandBase, ...) puisque vous devez faire quelque chose lorsque le bouton est cliqué.

Dans ce cas, vous lier à une propriété de commande sur le ViewModel, vous renvoyez false sur le CanExecute dans la commande et le bouton est désactivé. Parfois, vous devez appeler CommandManager.InvalidateRequerySuggested().

Cela n'explique pas pourquoi votre code ne fonctionne pas. Pour être honnête, ça me va.

+0

J'utilise caliburn parce que je lie la méthode du service, je ne voudrais pas créer de nouvelle commande, je poste seulement l'exemple. –

Questions connexes