none
WPF DataGrid CheckBox 如何点击一次选中 RRS feed

  • 问题

  • xaml代码如下:

    <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGridRow}},Path=IsSelected,Mode=OneWay}" HorizontalAlignment="Center"  VerticalAlignment="Center" />
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>

    2012年11月8日 2:44

答案

  • 你的代码是没有问题的,如果问题还是存在 可以给我个sample重现问题么


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月12日 9:16
    版主
  • 你要用DataGridCheckBoxColumn ,用templatecolumn做不了。

    <DataGridCheckBoxColumn  Binding="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGridRow}},Path=IsSelected}" Header="asdfsdaf"/>


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月19日 4:59
    版主

全部回复

  • 你的代码是没有问题的,如果问题还是存在 可以给我个sample重现问题么


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月12日 9:16
    版主
  • 前台代码:

    <Window x:Class="DataGridProblem.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid x:Name="SmsdataGrid" BorderThickness="0" Width="425"  IsReadOnly="True"  AutoGenerateColumns="False" GridLinesVisibility="None" CanUserAddRows="False" Background="White" RowHeaderWidth="0" Margin="0,0,0,-45"  >
                <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell" >
                        <Setter Property="BorderThickness" Value="0"/>
                    </Style>
                </DataGrid.CellStyle>
                <DataGrid.RowStyle>
                    <Style TargetType="DataGridRow">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="LightBlue"/>
                                <Setter Property="Foreground" Value="White"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DataGrid.RowStyle>
                <DataGrid.Columns>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.HeaderTemplate>
                            <DataTemplate>
                                <CheckBox  x:Name="ckbSelectedAll"></CheckBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.HeaderTemplate>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGridRow}},Path=IsSelected,Mode=TwoWay}" HorizontalAlignment="Center"  VerticalAlignment="Center" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="姓名"  Width="244">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <!--<Image Source="/DesktopAppWPF;component/resources/contacts.png" Stretch="None"></Image>-->
                                    <StackPanel>
                                        <TextBlock Text="{Binding Name}"></TextBlock>
                                        <!--<TextBlock Text="{Binding LastSMS.body}"></TextBlock>-->
                                    </StackPanel>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="号码"  Binding="{Binding Num}" Width="*">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="VerticalAlignment" Value="Center"></Setter>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>

    后台代码:

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;

    namespace DataGridProblem
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                MailListDatas ml = new MailListDatas();
                for (int i = 0; i < 10; i++)
                {
                    MailList st = new MailList();
                    st.Name = "ll" + i;
                    st.Num = "00" + i;
                    ml.MList.Add(st);
                }
                SmsdataGrid.ItemsSource = ml.MList;
            }
        }

        public class MailListDatas
        {
            private ObservableCollection<MailList> _MList = new ObservableCollection<MailList>();
            public ObservableCollection<MailList> MList
            {
                get
                {
                    return this._MList;
                }
            }
        }

        public class MailList
        {
            public string Name { set; get; }

            public string Num { set; get; }
        }
    }

    2012年11月19日 3:07
  • 你要用DataGridCheckBoxColumn ,用templatecolumn做不了。

    <DataGridCheckBoxColumn  Binding="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGridRow}},Path=IsSelected}" Header="asdfsdaf"/>


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月19日 4:59
    版主
  • 怎么利用checkbox可以进行多选,现在只能选中一个。还有就为什么要用DataGridCheckBoxColumn ,用templatecolumn做不了
    2012年11月19日 6:14
  • -->怎么利用checkbox可以进行多选

    这个问题你要新开个帖子

    --〉还有就为什么要用DataGridCheckBoxColumn ,用templatecolumn做不了

    因为绑定更新顺序不同,你用TemplateColumn的时候 是Twoway的绑定,你选中的时候 row没选中 又把选中的checkbox取消选中了。当取消掉之后,选中的row也取消掉了,你可以将TwoWay改成oneway去观察效果。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月19日 6:28
    版主