2015-09-10 3 views
1

У меня есть таблица с столбцом, содержащим значение bool, в которое я установил флажок. Я пытаюсь привязать команду к флажку, где, когда я его проверю, он запускает команды в модели просмотра. Я использую структуру MVVM. Вот что я сделал до сих пор.Связывание команды с элементом в 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> 

И вот RelayCommand в ViewModel.

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

Мне не удалось заставить его запустить RelayCommand. Любая идея, что я делаю неправильно?

+0

1) [изменить] 2) выбрать janky xaml 3) нажать ctrl-k до тех пор, пока он не станет более janky – Will

ответ

2

DataContext Checkbox будет установлен в один из объектов в ItemSource DataGrid (один из записей Diary.Diaries). Это приводит к тому, что команда недействительна.

Вам понадобится относительная привязка источника, чтобы вы могли добраться до Diary.FlagDiary. Вот один из способов сделать это (учитывая xaml, который вы опубликовали выше).

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

После командных пожаров, вероятно, вы хотите знать, какой Diary вход флажок был для ... верно? Для этого добавьте привязку CommandParameter к флажку. Теперь привязка выглядит так:

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

Возможно, также потребуется изменить код команды управления ретрансляцией. Наверное, что-то вроде этого?

FlagDiary = new RelayCommand((parameter) => 
{ 
    Debug.WriteLine(parameter.ToString()); 
}); 
Смежные вопросы