2013-01-23 3 views
1

Mon application WPF contient un DataGrid avec 3 colonnes et un bouton désactivé. Une colonne de mon DataGrid est un DataGridCheckBoxColumn. Maintenant, je veux lier IsEnabled -Property de Button, pour être activé si au moins l'un d'eux est coché, sinon rester désactivé.Le bouton de liaison au contenu DataGrid

En fait, je l'ai mise en œuvre suivante:

<Button x:Name="buttonStart" Content="Start" IsEnabled="{Binding Converter={StaticResource ButtonEnableConverter}, ElementName=gridTestCaseChooser}" /> 

Mais le convertisseur est appelée une seule fois au démarrage de l'application. Si le contenu de DataGrid change, ou que je coche/décoche un CheckBox, il n'y a pas un nouvel appel à mon convertisseur.

Comment est-ce que je pourrais faire ceci?

Répondre

1

L'utilisation MVVM peut être très facile:

  1. Déclare une propriété ICommand pour exécuter la logique du bouton avec un RelayCommand.
  2. Les éléments que vous ajoutez doivent implémenter l'interface INotifyPropertyChanged et posséder une propriété booléenne IsChecked qui déclenche l'événement PropertyChanged.
  3. Chaque fois qu'un nouvel élément est ajouté, abonnez-vous à son événement PropertyChanged et, lorsqu'il est supprimé, supprimez également le crochet.
  4. Chaque fois que la méthode d'accrochage est appelée, déclenche le PropertyChanged pour la propriété ICommand.
  5. En XAML il suffit de lier le bouton à la propriété ICommand.

ViewModels

public class Item: INotifyPropertyChanged 
    { 
     private bool isChecked; 
     public event PropertyChangedEventHandler PropertyChanged; 
     public bool IsChecked 
     { 
      get 
      { 
       return this.isChecked; 
      } 
      set 
      { 
       this.isChecked = value; 
       var propertyChangedEvent = PropertyChanged; 
       if(propertyChangedEvent != null) 
       { 
        propertyChangedEvent(this, new PropertyChangedEventArgs("UpdateSomething"); 
       }     
      } 
     } 
    } 

    public class MyViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     public ICommand UpdateSomething { get; private set; } 
     public ObservableCollection<Item> MyItems { get; set; } 

     public MyViewModel() 
     { 
      UpdateSomething = new RelayCommand(MyCommandExecute, MyCommandCanExecute); 
      MyItems = new ObservableCollection<Item>(); 
     } 

     private void MyCommandExecute(object parameter) 
     { 
      // Your logic here. 
     } 

     private void MyCommandCanExecute(object parameter) 
     { 
      return MyItems.Any(item => item.IsChecked); 
     } 

     private void AddItem(Item item) 
     { 
      item.PropertyChanged += ItemsPropertyChanged; 
      MyItems.Add(item); 
     } 

     private void ItemsPropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      var propertyChangedEvent = PropertyChanged; 
      if(propertyChangedEvent != null && 
       e.PropertyName == "IsChecked") 
      { 
       propertyChangedEvent(this, new PropertyChangedEventArgs("UpdateSomething"); 
      }     
    } 
+1

Utilisé avec quelques petits changements :-) Merci! – Kooki

1

pour votre bouton:

IsEnabled="{Binding ElementName=NN, Path=IsChecked}"> 

mise à jour après la question a été mise à jour

la même situation que vous avez est question ici: What causes a Value Converter to fire?

L'idée est de choisir quelque chose qui est vraiment changer son propre état

Mise à jour

essayer quelque chose comme ceci:

<dg:DataGrid.Columns> 
    <dg:DataGridTextColumn Header="First Name" Width="50"> 
     <dg:DataGridTextColumn.DataFieldBinding> 
     <Binding Path="FirstName" /> 
     </dg:DataGridTextColumn.DataFieldBinding> 
    </dg:DataGridTextColumn> 
    <dg:DataGridCheckBoxColumn Header="Active" Width="50" DataFieldBinding="{Binding Path= IsActive}" /> 
</dg:DataGrid.Columns> 
+0

J'ai mis à jour ma question. J'ai déjà essayé quelque chose comme ça, mais ça n'a pas fonctionné pour moi. – Kooki

+0

postez le code pour DataGrid s'il vous plaît.La partie où vous utilisez Converter – MikroDel

+1

Ma réponse est mise à jour – MikroDel

1

Vous devez lier pas comme élément visuel grille, mais plutôt à une DependencyProperty, dont la valeur est en train de changer. La grille elle-même ne change pas habituellement, c'est pourquoi le convertisseur n'est appelé qu'une seule fois au démarrage. Je voudrais créer un UserControl, qui a la grille avec des cases à cocher et le bouton. UserControl définit une propriété DependencyProperty de type bool, qui serait définie sur true ou false lorsque l'une des cases est cochée ou décochée. Puis la propriété IsEnabled de Button se lierait à DependencyProperty.

+0

Est-ce qu'il n'y a pas de possibilité de créer une liaison dans mon mainwindow.xaml, sans créer de propre contrôle? – Kooki

+0

Avec votre configuration actuelle, si je comprends bien, je pense qu'il n'y a pas une telle possibilité. Mais je peux me tromper, puisque je ne vois pas votre code en entier. Cependant, ce que vous essayez d'accomplir, c'est de lier plusieurs propriétés différentes, mais ce n'est pas possible. Vous pouvez uniquement lier à une seule propriété. – Haspemulator