2015-09-10 2 views
1

J'ai une table avec un avec une colonne contenant une valeur bool que j'ai mis une case à cocher. J'essaye de lier une commande à la case à cocher où où quand je la vérifie, elle exécute un commande dans le modèle View. J'utilise une structure MVVM. Voici ce que j'ai essayé jusqu'ici.Liaison Commande à élément dans DataGrid

<DataGrid 
        IsReadOnly="True" 
        Margin="0,10,0,0" 
        ItemsSource="{Binding Diary.Diaries}" 
        AutoGenerateColumns="False" 
        MinHeight="200" 
        SelectionMode="Single" 
        SelectionUnit="FullRow" 
        IsSynchronizedWithCurrentItem = "True" 
        > 
        <DataGrid.Columns> 
         <DataGridTemplateColumn Header="Flagged"> 
          <DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <Grid > 
             <CheckBox IsChecked="{Binding Flagged}" Command="{Binding Diary.FlagDiary}"> 
             </CheckBox> 
            </Grid> 
           </DataTemplate> 
          </DataGridTemplateColumn.CellTemplate> 
         </DataGridTemplateColumn > 

         <DataGridTextColumn Header="Diary ID" Binding="{Binding DiaryID}" />  
        </DataGrid.Columns> 

       </DataGrid> 

Et voici RelayCommand dans ViewModel.

FlagDiary = new RelayCommand(() => 
{ 
    Debug.WriteLine("Test"); 
}); 

Je n'ai pas pu l'obtenir pour exécuter RelayCommand. Une idée de ce que je fais mal?

+0

1) [modifier] 2) sélectionner janky xaml 3) frapper ctrl-k jusqu'à ce que janky ne soit plus – Will

Répondre

2

Le DataContext de Checkbox serait défini sur l'un des objets dans ItemSource du DataGrid (l'une des entrées Diary.Diaries). Cela rend la commande invalide.

Vous devrez effectuer une liaison de source relative afin de pouvoir accéder à Diary.FlagDiary. Voici une façon de le faire (compte tenu du xaml que vous avez posté ci-dessus).

<CheckBox IsChecked="{Binding Flagged}" 
    Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.Diary.FlagDiary}" /> 

Une fois les feux de commandement, vous voudrez probablement savoir quelle entrée du journal était la case à cocher pour ... non? Pour ce faire, ajoutez une liaison CommandParameter à la case à cocher. Maintenant, la liaison ressemble à ceci:

<CheckBox IsChecked="{Binding Flagged}" 
    Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.Diary.FlagDiary}" 
    CommandParameter={Binding} /> 

Votre code de commande de relais pourrait également devoir changer. Probablement quelque chose comme ça?

FlagDiary = new RelayCommand((parameter) => 
{ 
    Debug.WriteLine(parameter.ToString()); 
});