2009-04-17 16 views
13

Tengo un DataGrid en una forma de WPF con una DataGridCheckBoxColumn, pero no he encontrado ningún evento de clic, activada y desactivada por ello ...evento Click para DataGridCheckBoxColumn

Son estos eventos disponibles para el DataGridCheckBoxColumn? Si no es así, sugiera alguna solución alternativa que pueda utilizar.

Respuesta

1

¿No se accederá a estos a través de DataGridCell en lugar de a toda la columna?

Yo sé que estos eventos no son directamente en la DataGridCell, pero no es el método 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. 

¿Esto ayuda?

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

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 incluyen un campo booleano "marcado" que utilizamos para rellenar la cuadrícula de datos.

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 marcará & para mostrar 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(); 
} 
1

¿Qué tal algo así.

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 posible que tenga problemas con la virtualización y verificados artículos no limpiar (no estoy seguro, no se han probado con SelectionMode =" Soltero"). Si ese es el caso, la solución más simple que he encontrado para funcionar es desactivar la virtualización, pero tal vez haya una mejor manera de evitar ese problema en particular.

12

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 para la columna. Es una buena solución simple.

Tal vez se puede utilizar como EventSetter siguiente ejemplo:

de marcado:

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