2009-04-17 6 views
13

Я имею в форме WPF в DataGrid с DataGridCheckBoxColumn, но я не нашел какое-либо событие щелчка, проверяемых и непроверяемых для него ...Нажмите событие для DataGridCheckBoxColumn

ли эти события доступны для 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. 

ли эта помощь?

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

Расширение концепции 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, который содержит список элементов данных, в том числе логическое поле «Проверено», который мы используем для заполнения 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(); 
} 
1

Как насчет чего-то подобного.

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 =» Один"). Если это так, простейшее обходное решение, которое я нашел для работы, - это отключить виртуализацию, но, возможно, есть лучший способ обойти эту проблему.

12

Цитируется ответ Уильяма Хана здесь: http://social.msdn.microsoft.com/Forums/ar/wpf/thread/9e3cb8bc-a860-44e7-b4da-5c8b8d40126d

Это просто добавляет событие в колонке. Это хорошее простое решение.

Может быть, вы можете использовать EventSetter в качестве примера ниже:

Markup:

<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)); 
     } 
    } 
} 
Смежные вопросы