26

DataGrid含む WPF フォームを持ってDataGridCheckBoxColumnいますが、クリック イベントが見つかりませんでした。

これらのイベントは で利用できますDataGridCheckBoxColumnか? そうでない場合は、使用できる回避策を提案してください。

4

6 に答える 6

27

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));
        }
    }
}
于 2013-03-06T12:33:31.897 に答える
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 は、データグリッドに入力するために使用するブール フィールド「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();
}
于 2011-04-27T20:36:52.140 に答える
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>

ただし、このアプローチの1つの注意点は、仮想化で問題が発生し、チェックされた項目がクリアされない可能性があることです(確かではありませんが、SelectionMode = "Single"でテストされていません)。その場合、私が見つけた最も簡単な回避策は仮想化をオフにすることですが、おそらくその特定の問題を回避するためのより良い方法があります。

于 2013-02-20T23:52:25.747 に答える
1
<wpf:DataGridCheckBoxColumn Header="Cool?" Width="40" Binding="{Binding IsCool}"/>
于 2009-04-17T10:28:43.443 に答える
0

スタイルにイベントを追加したくない場合は、この方法でも実行できます。

            <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>
于 2019-02-19T18:58:59.573 に答える
0

これを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);
于 2021-11-16T18:14:27.423 に答える