をDataGrid
含む WPF フォームを持ってDataGridCheckBoxColumn
いますが、クリック イベントが見つかりませんでした。
これらのイベントは で利用できますDataGridCheckBoxColumn
か? そうでない場合は、使用できる回避策を提案してください。
をDataGrid
含む WPF フォームを持ってDataGridCheckBoxColumn
いますが、クリック イベントが見つかりませんでした。
これらのイベントは で利用できますDataGridCheckBoxColumn
か? そうでない場合は、使用できる回避策を提案してください。
William Han の回答から引用: 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)); } } }
上記の 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 は、データグリッドに入力するために使用するブール フィールド「Checked」を含むデータ要素のリストを含む ObservableCollection オブジェクトです。
ここでの 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();
}
このようなものはどうですか。
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>
ただし、このアプローチの1つの注意点は、仮想化で問題が発生し、チェックされた項目がクリアされない可能性があることです(確かではありませんが、SelectionMode = "Single"でテストされていません)。その場合、私が見つけた最も簡単な回避策は仮想化をオフにすることですが、おそらくその特定の問題を回避するためのより良い方法があります。
<wpf:DataGridCheckBoxColumn Header="Cool?" Width="40" Binding="{Binding IsCool}"/>
スタイルにイベントを追加したくない場合は、この方法でも実行できます。
<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>
これをxmlで試してください
<DataGridCheckBoxColumn Header="" IsThreeState="False" Binding="{Binding isCheck, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}" />
そしてC#で
public partial class UploadWindow : Window
{
ObservableCollection<Items> pl = new ObservableCollection<Items>();
class Items
{
public bool isCheck { get; set; }
}
public UploadWindow(Dictionary<string, object> ipDictionary)
{
InitializeComponent();
GridView1.ItemsSource = pl;
}
}
私の場合、チェックされたすべてのチェックボックスを見つける必要があります
var allChecked = pl.Where(x => x.isCheck == true);