单击数据网格行上的任何位置时的WPF - Ticking复选框

时间:2017-03-27 15:17:54

标签: c# wpf xaml checkbox datagrid

Datagrid example

图片显示了我的数据网格中添加的一些项目的示例。现在我只能通过点击它来更改每一行复选框,但我希望能够点击每行的任意位置来更改那些行复选框。

数据网格和行模板的XAML:

  <DataGrid Grid.Row="1" SnapsToDevicePixels="True" BorderThickness="0" SelectedItem="{Binding Selected}" ItemsSource="{Binding Source={StaticResource ColViewSource},Mode=OneWay}"   AutoGenerateColumns="False" x:Name="dataGrid" HeadersVisibility="None" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled">

        <DataGrid.GroupStyle>
            <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
                <GroupStyle.Panel>
                    <ItemsPanelTemplate>
                        <DataGridRowsPresenter></DataGridRowsPresenter>
                    </ItemsPanelTemplate>
                </GroupStyle.Panel>

            </GroupStyle>
        </DataGrid.GroupStyle>

    </DataGrid>

 <Style TargetType="DataGridRow">

     <Style.Triggers>
            <DataTrigger Binding="{Binding Type}" Value="TTC">
                <Setter Property="Template"  Value="{StaticResource ResourceKey=TTC}"/>
            </DataTrigger>

           </Style.Triggers>

    </Style>

<ControlTemplate x:Key="TTC">
        <Grid Style="{StaticResource rowGridStyle}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition MinWidth="30"/>
                <ColumnDefinition />
                <ColumnDefinition/>
                <ColumnDefinition/>


            </Grid.ColumnDefinitions>
            <TextBox Style="{StaticResource commentboxStyle}" Text="{Binding Comment,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="0" Grid.ColumnSpan="3" ></TextBox>
            <TextBlock Style="{StaticResource textblockStyle}" Text="{Binding Text1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.ColumnSpan="2"/>
            <Label Style="{StaticResource labelStyle}" Content="{Binding Text2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" HorizontalAlignment="Right" />
            <CheckBox Style="{StaticResource RectBox}" IsChecked="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" HorizontalAlignment="Center" IsThreeState="True"/>
            <Path Style="{StaticResource dottedpathStyle}"/>

        </Grid>
    </ControlTemplate>

有关如何实现这一目标的任何提示?

2 个答案:

答案 0 :(得分:1)

您可以为DataGridRow样式添加处理程序,将数据对象的IsChecked属性设置为true

<Style TargetType="DataGridRow">
    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnPreviewMouseLeftButtonDown" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Type}" Value="TTC">
            <Setter Property="Template"  Value="{StaticResource ResourceKey=TTC}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
private void OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (!(e.Source is CheckBox))
    {
        DataGridRow row = sender as DataGridRow;
        YourDataClass dataObject = row.DataContext as YourDataClass;
        if (dataObject != null)
            dataObject.IsChecked = true;
    }
}

确保YourDataClass实现INotifyPropertyChanged接口,并在PropertyChanged属性的setter中引发IsChecked事件。

答案 1 :(得分:0)

防止代码落后并使用System.Windows.Interactivity.Behaviour

public class SelectedCheckBoxBehaviour : System.Windows.Interactivity.Behavior<FrameworkElement>
{
    protected override void OnAttached()
    {

        AssociatedObject.MouseDown += AssociatedObject_MouseDown;

        base.OnAttached();
    }

    private void AssociatedObject_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        FrameworkElement self = sender as FrameworkElement;

        if(self != null)
        {
            MyViewModel dataContext = self.DataContext as MyViewModel;

            dataContext.IsChecked = !dataContext.IsChecked;
        }
    }

    protected override void OnDetaching()
    {
        AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
        base.OnDetaching();
    }
}

命名空间

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:behaviour="clr-namespace:WpfApplication.Behaviour" 


<!-- ... --->


    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="30"/>
            <ColumnDefinition />
            <ColumnDefinition/>
            <ColumnDefinition/>


        </Grid.ColumnDefinitions>
        <TextBox Text="{Binding Comment,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="0" Grid.ColumnSpan="3" ></TextBox>
        <TextBlock Text="{Binding Text1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.ColumnSpan="2"/>
        <Label  Content="{Binding Text2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" HorizontalAlignment="Right" />
        <CheckBox IsChecked="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" HorizontalAlignment="Center" IsThreeState="True"/>
        <Path />

        <i:Interaction.Behaviors>
            <behaviour:SelectedCheckBoxBehaviour />
        </i:Interaction.Behaviors>

    </Grid>

这应该有效 - Tut