将附加事件添加到DataGridColumn

时间:2015-03-12 19:56:27

标签: c# wpf

我正在尝试在网格中使用DataGridCheckBoxColumn,并且我注意到由于某种原因它没有被检查或未选中的事件。

我试图通过创建一个继承DataGridCheckBoxColumn的自定义CBColumn类来为此添加附加事件。

我遇到的问题是我不知道如何将处理程序添加到公开的属性,因为DataGridCheckBoxColumn不是从UIElement派生的。

因此,此代码块中没有AddHandler和RemoveHandler:

 public event RoutedEventHandler Checked
    {
        add { AddHandler(CheckedEvent, value); }
        remove { RemoveHandler(CheckedEvent, value); }
    }

关于如何做到这一点的任何想法?我看上去一切都没有运气。

编辑:我正在使用MVVM,所以我需要尽可能避免Code Behind。

3 个答案:

答案 0 :(得分:0)

Click event for DataGridCheckBoxColumn

<DataGridCheckBoxColumn Binding="{Binding Path=LikeCar}" Header="LikeCar">
                    <DataGridCheckBoxColumn.CellStyle>
                        <Style>
                            <EventSetter Event="CheckBox.Checked" Handler="OnChecked"/>
                        </Style>
                    </DataGridCheckBoxColumn.CellStyle>
                </DataGridCheckBoxColumn>

答案 1 :(得分:0)

这是代码中的另一个解决方案。这非常粗糙,但它会显示复选框并显示文本框中选中内容的数字值。

<Window x:Class="DataGridCheckBoxItemTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:DataGridCheckBoxItemTest"
    Title="MainWindow" Height="350" Width="525">

<Window.DataContext>
    <vm:DataGridTestVM />
</Window.DataContext>

<Grid>
    <DataGrid ItemsSource="{Binding Source}" 
              SelectedValue="{Binding Selected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              Margin="10">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Header="Test Checked" Binding="{Binding S}"/>
        </DataGrid.Columns>
    </DataGrid>

    <TextBox HorizontalAlignment="Left" 
             Text="{Binding Test, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
             Height="39" 
             Margin="20,244,0,0" 
             TextWrapping="Wrap" 
             VerticalAlignment="Top" 
             Width="237"/>
</Grid>

namespace DataGridCheckBoxItemTest
{
 public class DataGridTestVM : INotifyPropertyChanged
 {
   ObservableCollection<Source> source;
   Source s;
   int test;

public DataGridTestVM()
{
  source = new ObservableCollection<Source>();
  for (int i = 0; i < 10; i++)
  {
    s = new Source();
    s.test = i;
    source.Add(s);
  }
}

public ObservableCollection<Source> Source
{
  get
  {
    return source;
  }

  set
  {
    source = value;
    OnPropertyChanged("Source");
  }
}

public int Test
{
  get
  {
    return test;
  }

  set
  {
    test = value;
    OnPropertyChanged("Test");
  }
}

public Source Selected
{
  get
  {
    return s;
  }

  set
  {
    s = value;
    Test = s.test;
    OnPropertyChanged("Selected");
  }
}

   public event PropertyChangedEventHandler PropertyChanged;
   public void OnPropertyChanged(string name)
   {
     if (this.PropertyChanged != null)
     {
       this.PropertyChanged(this, new PropertyChangedEventArgs(name));
     }
   }
 }

 public class Source
 {
   public int test;
 }
}

答案 2 :(得分:0)

我最终只是恢复到DataGridTemplateColumn并使用复选框控件。难道没有办法做我想做的事。