Событие Click для DataGridCheckBoxColumn
У меня есть DataGrid
в форме WPF с DataGridCheckBoxColumn
, но я не нашел никакого события click, Checked и unchecked для него...
Доступны ли эти события для DataGridCheckBoxColumn
? Если нет, предложите некоторое обходное решение, которое я мог бы использовать.
Ответы
Ответ 1
Не будет ли доступ к ним через отдельный DataGridCell, а не весь столбец?
Я знаю, что эти события не относятся непосредственно к DataGridCell, но есть метод CommandBindings:
// Summary:
// Gets a collection of System.Windows.Input.CommandBinding objects associated
// with this element. A System.Windows.Input.CommandBinding enables command
// handling for this element, and declares the linkage between a command, its
// events, and the handlers attached by this element.
//
// Returns:
// The collection of all System.Windows.Input.CommandBinding objects.
Помогает ли это?
Ответ 2
Это цитата из ответа Уильяма Ханна здесь: http://social.msdn.microsoft.com/Forums/ar/wpf/thread/9e3cb8bc-a860-44e7-b4da-5c8b8d40126d
Он просто добавляет событие в столбец. Это хорошее простое решение.
Возможно, вы можете использовать EventSetter
в качестве примера ниже:
Разметка:
<Window x:Class="DataGridCheckBoxColumnTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataGridCheckBoxColumnTest"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:People x:Key="People"/>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{StaticResource People}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Name}" Header="Name"/>
<DataGridCheckBoxColumn Binding="{Binding Path=LikeCar}" Header="LikeCar">
<DataGridCheckBoxColumn.CellStyle>
<Style>
<EventSetter Event="CheckBox.Checked" Handler="OnChecked"/>
</Style>
</DataGridCheckBoxColumn.CellStyle>
</DataGridCheckBoxColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
код:
using System;
using System.Windows;
namespace DataGridCheckBoxColumnTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
void OnChecked(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}
}
}
namespace DataGridCheckBoxColumnTest
{
public class Person
{
public Person(string name, bool likeCar)
{
Name = name;
LikeCar = likeCar;
}
public string Name { set; get; }
public bool LikeCar { set; get; }
}
}
using System.Collections.Generic;
namespace DataGridCheckBoxColumnTest
{
public class People : List<Person>
{
public People()
{
Add(new Person("Tom", false));
Add(new Person("Jen", false));
}
}
}
Ответ 3
Расширяясь по концепции DataGridCell, отмеченной выше, это то, что мы использовали, чтобы заставить ее работать.
... XAML...
<DataGrid Grid.ColumnSpan="2" Name="dgMissingNames" ItemsSource="{Binding Path=TheMissingChildren}" Style="{StaticResource NameListGrid}" SelectionChanged="DataGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTemplateColumn CellStyle="{StaticResource NameListCol}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" Name="theCheckbox" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding Path=SKU}" Header="Album" />
<DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" "/>
<DataGridTextColumn Binding="{Binding Path=Pronunciation}" Header="Pronunciation" />
</DataGrid.Columns>
</DataGrid>
TheMissingChildren - объект ObservableCollection, который содержит список элементов данных, включая логическое поле "Checked", которое мы используем для заполнения datagrid.
Код SelectionChanged здесь установит проверочное булевое значение в базовом объекте TheMissingChildren и закроет обновление списка элементов. Это гарантирует, что окно будет проверено и отобразит новое состояние независимо от того, где вы нажимаете на строку. Щелчок по флажку или где-нибудь в строке будет включать/выключить проверку.
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid ThisGrid = (DataGrid)sender;
CheckedMusicFile ThisMusicfile = (CheckedMusicFile)ThisGrid.SelectedItem;
ThisMusicfile.Checked = !ThisMusicfile.Checked;
ThisGrid.Items.Refresh();
}
Ответ 4
Как насчет чего-то подобного.
partial class SomeAwesomeCollectionItems : INotifyPropertyChanged
{
public event PropertyChanged;
protected void OnPropertyChanged(string property)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(property);
}
private bool _IsSelected;
public bool IsSelected { get { return _IsSelected; } set { _IsSelected = Value; OnPropertyChanged("IsSelected"); } }
}
Тогда в XAML
<DataGrid ItemsSource="{Binding Path=SomeAwesomeCollection"} SelectionMode="Single">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridRow}"
BasedOn="{StaticResource {x:Type DataGridRow}}">
<!--Note that you will probably need to base on other style if you have stylized your DataGridRow-->
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" />
</Style>
</DataGrid.Resources
<DataGrid.Columns>
<DataGridCheckBoxColumn Binding="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" />
<!--More Columns-->
</DataGrid.Columns>
</DataGrid>
Однако одна нота с этим подходом заключается в том, что вы можете столкнуться с проблемами с виртуализацией и проверенными элементами, не очищающими (не уверен, не тестировались с помощью SelectionMode = "Single" ). Если это так, простейшее обходное решение, которое я нашел для работы, - это отключить виртуализацию, но, возможно, есть лучший способ обойти эту конкретную проблему.
Ответ 5
<wpf:DataGridCheckBoxColumn Header="Cool?" Width="40" Binding="{Binding IsCool}"/>