i以下代码
<DataGrid.RowHeaderTemplate >
<DataTemplate>
<CheckBox x:Name="SelectedItemCheckBox"
Margin="5 0 0 0"
IsChecked="{Binding Path=IsSelected,
Mode=TwoWay,
RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGridRow}}}">
</CheckBox>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
或
<DataGrid.RowHeaderStyle>
<Style TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Background" Value="White"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridRowHeader}">
<CheckBox x:Name="SelectedItemCheckBox"
Margin="5 0 0 0"
IsChecked="{Binding Path=IsSelected,
Mode=TwoWay,
RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGridRow}}}">
</CheckBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.RowHeaderStyle>
选择行时如何从后面的代码访问SelectedIteMcheckbox?
到目前为止我拥有的东西:
private CheckBox GetCheckbox(int index)
{
DataGridRow row = (DataGridRow)MyGrid.ItemContainerGenerator.ContainerFromIndex(index);
//how do I get to that checkbox here ?
}
MyGrid的项目库是在代码后面设置的,通常我会通过访问myGrid.columns []访问单元格,但是这是一个行标题,它不是列[]的一部分[]。
请注意,根据项目的大小,定义此复选框有很多行。
我也想知道是否有一种访问复选框而不更改XAML并按原样使用它的方法。
如果要在代码范围中访问行标头的复选框(并且不使用绑定),则可以"传播"所选datagridrow的视觉树以找到标头。/p>
添加选择变化事件处理程序到数据杂志:
<DataGrid x:Name="Grid" Loaded="Grid_Loaded" SelectionChanged="Grid_SelectionChanged">
然后在代码中:
- 获取选定的行
- 使用VisualTreeHelper查找标题的复选框
做魔术
private void Grid_SelectionChanged(object sender, SelectionChangedEventArgs e) { var item = (DataGridRow)Grid.ItemContainerGenerator.ContainerFromItem(e.AddedItems[0]); var control = FindChild<CheckBox>(item, "SelectedItemCheckBox"); control.IsChecked = true; }
对于Findchild,这里有多个选项:我如何通过名称或类型找到WPF控件?
我在此示例中使用了以下内容:如何通过名称或类型找到WPF控件?
public static T FindChild<T>(DependencyObject depObj, string childName)
where T : DependencyObject
{
// Confirm obj is valid.
if (depObj == null) return null;
// success case
if (depObj is T && ((FrameworkElement)depObj).Name == childName)
return depObj as T;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
//DFS
T obj = FindChild<T>(child, childName);
if (obj != null)
return obj;
}
return null;
}