personalizar how ejemplo column wpf events datagrid wpfdatagrid

wpf - how - Haga clic en el evento para DataGridCheckBoxColumn



personalizar datagrid wpf (5)

Tengo un DataGrid en un formulario WPF con un DataGridCheckBoxColumn , pero no encontré ningún evento de clic, marcado y desactivado para ello ...

¿Están estos eventos disponibles para el DataGridCheckBoxColumn ? Si no, por favor sugiera alguna solución que podría usar.


Ampliando el concepto de DataGridCell mencionado anteriormente, esto es lo que usamos para que funcione.

... 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 es un objeto ObservableCollection que contiene la lista de elementos de datos que incluye un campo booleano "Checked" que usamos para rellenar el datagrid.

El código SelectionChanged aquí establecerá el booleano comprobado en el objeto TheMissingChildren subyacente y activará una actualización de la lista de elementos. Eso asegura que la casilla se marque y muestre el nuevo estado sin importar dónde haga clic en la fila. Al hacer clic en la casilla de verificación o en algún lugar de la fila, se activará / desactivará la verificación.

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { DataGrid ThisGrid = (DataGrid)sender; CheckedMusicFile ThisMusicfile = (CheckedMusicFile)ThisGrid.SelectedItem; ThisMusicfile.Checked = !ThisMusicfile.Checked; ThisGrid.Items.Refresh(); }


Citado de la respuesta de William Han aquí: http://social.msdn.microsoft.com/Forums/ar/wpf/thread/9e3cb8bc-a860-44e7-b4da-5c8b8d40126d

Simplemente agrega un evento a la columna. Es una buena solución simple.

Quizás puedas usar EventSetter como ejemplo a continuación:

Margen:

<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>

Código:

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)); } } }


Qué tal algo como esto.

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"); } } }

Luego en 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>

Una nota con este enfoque, sin embargo, es que puede tener problemas con la virtualización y los elementos marcados que no se están eliminando (no está seguro, no se han probado con SelectionMode = "Single"). Si ese es el caso, la solución más sencilla que he encontrado para trabajar es apagar la virtualización, pero quizás haya una mejor manera de solucionar ese problema en particular.


Si no desea agregar el evento a su estilo, también puede hacerlo de esta manera.

<DataGridCheckBoxColumn x:Name="name" Header="name?" Binding="{Path=Name}" <DataGridCheckBoxColumn.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> <EventSetter Event="CheckBox.Checked" Handler="Checked"/> </Style> </DataGridCheckBoxColumn.CellStyle> </DataGridCheckBoxColumn>eckBoxColumn.CellStyle> </DataGridCheckBoxColumn>


<wpf:DataGridCheckBoxColumn Header="Cool?" Width="40" Binding="{Binding IsCool}"/>