2009-02-14 3 views
2

Можно ли связать DataGridCheckBoxColumn с методом click? Или событие на уровне строки или строке вводит событие?Являются ли события Checkbox Silverlight DataGrid?

Я пытаюсь выполнить DataGrid, который обновляет лежащий отфильтрованную коллекцию ObservableCollection (большой sameple здесь http://petermcg.wordpress.com/2009/01/29/filtering-silverlight-datagrid-rows/)

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

Какие-либо предложения о том, как внедрить datagrid, который обновляет базовую коллекцию при нажатии флажка?

Пожалуйста, найдите ниже мой Xaml, это действительно ничего особенного.



ответ

11

DataGridCheckBoxColumn Тип в настоящее время не обеспечивает Click событие, на самом деле в настоящее время не предоставляют каких-либо событий. Ячейка, отображаемая в столбце этого типа, просто реализует привязку TwoWay между свойством IsChecked элемента управления CheckBox и свойством (указанным в Binding) в экземпляре T в текущей строке ObservableCollection <T>, что DataGrid является связанный с.

Вы не предоставляете свой Xaml, поэтому я буду использовать пример из своего сообщения в блоге, на которое ссылается ваш вопрос. Обходной путь включает указываемый DataGridTemplateColumn, содержащий CheckBox и определение Click событие следующим образом:

<data:DataGrid x:Name="FilteredPeople" AutoGenerateColumns="False"> 
    <data:DataGrid.Columns> 
    <data:DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" /> 
    <data:DataGridTextColumn Header="Age" Binding="{Binding Age}" /> 
    <data:DataGridCheckBoxColumn Header="Visible" Binding="{Binding IsVisible}" /> 

    <data:DataGridTemplateColumn Header="Row Filter"> 
     <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox x:Name="RowFilterButton" IsChecked="{Binding IsVisible}" 
       Content="Filter" Tag="{Binding}" Click="RowFilterButton_Click" /> 
     </DataTemplate> 
     </data:DataGridTemplateColumn.CellTemplate> 
    </data:DataGridTemplateColumn> 

    </data:DataGrid.Columns> 
</data:DataGrid> 

альтернативой CheckBox в этом случае может быть ToggleButton или нормального управления Button. Обратите внимание на привязку свойства Tag к CheckBox. Это помогает выяснить, в которой строке CheckBox была нажата с фоновым кодом:

private void RowFilterButton_Click(object sender, RoutedEventArgs e) 
{ 
    Person person = ((CheckBox)sender).Tag as Person; 
} 

Вы можете удалить этот человек из ObservableCollection <T> или изменить его свойства, чтобы отфильтровать или обновить DataGrid в зависимости от обстоятельств.

Это нормально, когда этот ответ заканчивается, но если у вас нет this update installed, в стандартной версии DataGrid для Silverlight 2 DataGrid по умолчанию используется SDK, который предотвращает это. В этом случае ошибка будет проявляться с помощью DataGrid, не рисующего строку, в которой находится CheckBox (вместо этого вы получаете видимую невидимую строку), если вы вызываете фильтрацию DataGrid при нажатии этой CheckBox (т. Е. Флажок имеет фокус) ,

Чтобы избежать этой ошибки, установите update или инициировать какие-либо манипуляции ObservableCollection <T> DataGrid привязан к из элемента управления вне строк в DataGrid в as per this example.

+0

Благодарим за помощь. Это намного более чистый метод, а затем использование события ReadyingCellForEdit, поскольку он не требует двойного щелчка пользователя. Спасибо за вашу помощь. –

+1

Просто прочитайте свой ответ, Питер, и этот тэг = «{Binding}» трюк только что сделал мой день, спасибо! – Vinzz