WPF:在DataTrigger中使用复选框IsChecked属性

时间:2015-11-24 14:22:59

标签: c# .net wpf

我正在尝试在DataTrigger中使用WPF复选框的IsChecked属性。基于我设置特定DataGridRow背景的值。

我的工作代码

    <Style TargetType="{x:Type DataGridRow}">
                <Setter Property="Background" Value="LightGray" />
                <Setter Property="SnapsToDevicePixels" Value="true"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=chkbox, Path=IsChecked}" Value="true">
                        <Setter Property="Background" Value="LightCyan" />
                     </DataTrigger>
                </Style.Triggers>
            </Style>

<DataGrid x:Name="dataGrid1" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTemplateColumn MinWidth="40" Width="Auto" Header="Select">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox  x:Name="chkbox" IsChecked="{Binding Selected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></CheckBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>

                    </DataGridTemplateColumn>

            </DataGrid.Columns>
  </DataGrid>

然后我检查了这个link并更改了以下代码并且工作正常。这里已选择是我的公共财产。

 <Style TargetType="{x:Type DataGridRow}">
                <Setter Property="Background" Value="LightGray" />
                <Setter Property="SnapsToDevicePixels" Value="true"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Selected}" Value="true">
                        <Setter Property="Background" Value="LightCyan" />
                      </DataTrigger>
                </Style.Triggers>
            </Style>

请帮助我理解为什么我的原始代码不起作用?我错过了什么。
谷歌没有帮助。令人惊讶的是,SO上也没有线索!谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

原始代码无法正常工作,因为您试图通过ElementName找到一个对象,该对象作为模板化对象存在,因此在之后绑定尝试时才会创建解决。通常,在引用可视树中的祖先对象时,您应该只使用ElementName,而不是儿童,尤其是模板化的孩子。

正如评论中所述,此处也无法使用{RelativeSource FindAncestor...绑定,因为CheckBoxDataGridRow

的孩子,而不是祖先。